85 votes

Conversion de tableau d'octets en chaîne (Java)

Je suis en train d'écrire une application web dans Google app Engine. Il permet aux gens de fondamentalement modifier le code html qui est stocké comme un .html fichier dans le blobstore.

Je suis en utilisant fetchData pour retourner un byte[] de tous les caractères dans le fichier. Je suis en train d'imprimer un code html pour l'utilisateur de modifier le code html. Tout fonctionne très bien!

Voici mon seul problème maintenant:

Le tableau d'octets est d'avoir quelques problèmes lors de la conversion en une chaîne de caractères. Guillemets et un couple de personnages sont à venir chercher funky. (?'s ou de symboles japonais etc.) Plus précisément, il est plusieurs octets, j'en vois qui ont des valeurs négatives qui sont à l'origine du problème.

Les guillemets sont de retour en tant que -108 et -109 dans le tableau d'octets. Pourquoi est-ce et comment décoder le négatif octets pour montrer le bon codage de caractères?

141voto

Andreas_D Points 64111

Le tableau d'octets contient des caractères spéciaux de l'encodage (que vous devez savoir). La façon de convertir une Chaîne de caractères est:

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

La raw octets peut apparaître comme négatif décimales simplement parce que le java de type de données byte est signé, il couvre la gamme de -128 à 127.


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

La valeur (-109) est un non-imprimable caractère de contrôle dans UNICODE. Donc UTF-8 n'est pas le bon encodage pour que les flux de caractères.

0x93 "Windows-1252" est le "smart devis" que vous cherchez, le Java, le nom de l'encodage est "Cp1252". La ligne suivante fournit un code de test:

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

11voto

MuhammadAamirALi Points 2555

Vous pouvez essayer ça.

 String s = new String(bytearray);
 

5voto

Adi Sembiring Points 1529
 public class Main {

    /**
     * Example method for converting a byte to a String.
     */
    public void convertByteToString() {

        byte b = 65;

        //Using the static toString method of the Byte class
        System.out.println(Byte.toString(b));

        //Using simple concatenation with an empty String
        System.out.println(b + "");

        //Creating a byte array and passing it to the String constructor
        System.out.println(new String(new byte[] {b}));

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().convertByteToString();
    }
}
 

Sortie

 65
65
A
 

5voto

craig Points 51
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
}

3voto

Simon G. Points 3285

La réponse précédente de Andreas_D est bon. Je vais juste ajouter que, où que vous soyez affichage de la sortie, il y aura une police et un codage de caractères et il ne peut pas soutenir certains caractères.

Pour déterminer si elle est de Java ou de votre écran qui est un problème, faites ceci:

    for(int i=0;i<str.length();i++) {
        char ch = str.charAt(i);
        System.out.println(i+" : "+ch+" "+Integer.toHexString(ch)+((ch=='\ufffd') ? " Unknown character" : ""));
    }

Java vous avez mappé tous les caractères, il ne peut pas comprendre à 0xfffd le caractère officiel de caractères inconnus. Si vous voyez un"? " dans la sortie, mais il n'est pas mappé à 0xfffd, il est de votre police d'affichage ou de codage qui est le problème, pas de Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X