Conversione di array di byte in String(Java)



java byte array to utf8 string (5)

Sto scrivendo un'applicazione web nell'app Google Engine. Permette alle persone di modificare fondamentalmente il codice html che viene memorizzato come file .html nel blobstore.

Sto usando fetchData per restituire un byte[] di tutti i caratteri nel file. Sto provando a stampare su un codice HTML in modo che l'utente possa modificare il codice html. Tutto funziona alla grande!

Ecco il mio unico problema ora:

L'array di byte presenta alcuni problemi durante la conversione in una stringa. Citazioni intelligenti e un paio di personaggi stanno uscendo con un aspetto funky. (? o simboli giapponesi ecc.) In particolare sono diversi i byte che sto vedendo che hanno valori negativi che stanno causando il problema.

Le virgolette intelligenti tornano come -108 e -109 nell'array di byte. Perché questo e come posso decodificare i byte negativi per mostrare la corretta codifica dei caratteri?

https://ffff65535.com


A partire da Java 7 è anche possibile passare la codifica desiderata al costruttore di String come costante Charset da StandardCharsets .

Questo potrebbe essere più sicuro che passare la codifica come String , come suggerito nelle altre risposte, e dovresti farlo in questo modo se stai usando Java 7 o versioni successive.

Esempio per la codifica UTF-8

String bytesAsString = new String(bytes, StandardCharsets.UTF_8);

La matrice di byte contiene caratteri in una codifica speciale (che dovresti sapere). Il modo per convertirlo in una stringa è:

String decoded = new String(bytes, "UTF-8");  // example for one encoding type

By The Way - i byte grezzi visualizzati possono apparire come decimali negativi solo perché il byte tipo di dati java è firmato, copre l'intervallo da -128 a 127.

-109 = 0x93: Control Code "Set Transmit State"

Il valore (-109) è un carattere di controllo non stampabile in UNICODE. Quindi UTF-8 non è la codifica corretta per quel flusso di caratteri.

0x93 in "Windows-1252" è la "citazione intelligente" che stai cercando, quindi il nome Java di quella codifica è "Cp1252". La riga successiva fornisce un codice di prova:

System.out.println(new String(new byte[]{-109}, "Cp1252")); 

Puoi provare questo

String s = new String(bytearray);

Suggerisco Arrays.toString(byte_array);

Dipende dal tuo scopo. Ad esempio, volevo salvare un array di byte esattamente come il formato che puoi vedere al momento del debug che è qualcosa del genere: [1, 2, 3] Se vuoi salvare esattamente lo stesso valore senza convertire i byte in formato carattere, Arrays.toString (byte_array) fa questo ,. Ma se vuoi salvare caratteri invece di byte, dovresti usare String s = new String(byte_array) . In questo caso, s è uguale all'equivalente di [1, 2, 3] in formato di carattere.


public static String readFile(String fn)   throws IOException 
{
    File f = new File(fn);

    byte[] buffer = new byte[(int)f.length()];
    FileInputStream is = new FileInputStream(fn);
    is.read(buffer);
    is.close();

    return  new String(buffer, "UTF-8"); // use desired encoding
}




bytearray