Question

Pourquoi les éléments suivants sont-ils affichés sous Linux vs Windows?

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));

sous Windows:

¿

sous Linux:

¿

Était-ce utile?

La solution

System.out.println () renvoie le texte dans le codage par défaut du système, mais la console interprète cette sortie en fonction de son propre paramètre de codage (ou "page de code"). Sur votre ordinateur Windows, les deux encodages semblent correspondre, mais sous Linux, la sortie est apparemment en UTF-8, tandis que la console le décode comme un encodage à un octet comme ISO-8859-1. Ou peut-être, comme Jon l'a suggéré, le fichier source est-il enregistré au format UTF-8 et javac le lit-il autrement, ce qui peut être évité en utilisant des échappements Unicode.

Lorsque vous devez exporter autre chose que du texte ASCII, le mieux est de l'écrire dans un fichier en utilisant un codage approprié, puis de lire le fichier avec un éditeur de texte - les consoles sont trop limitées et dépendent trop du système. Au fait, ce morceau de code:

new String("¿".getBytes("UTF-8"), "UTF-8")

... n'a aucun effet sur la sortie. Tout ce qui fait est de coder le contenu de la chaîne dans un tableau d'octets et de le décoder à nouveau, en reproduisant la chaîne d'origine - un coûteux no-op. Si vous souhaitez générer du texte dans un codage particulier, vous devez utiliser un OutputStreamWriter, comme suit:

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

Autres conseils

Vous ne savez pas exactement où se situe le problème, mais il convient de noter que

& # 194; & # 191; (0xc2,0xbf)

est le résultat du codage avec UTF-8

0xbf,

qui est le point de code Unicode pour & # 191;

Ainsi, il semble que dans le cas de Linux, la sortie ne soit pas affichée sous la forme utf-8, mais sous la forme d'une chaîne à un octet

Vérifiez le codage de votre terminal Linux.

Pour gnome-terminal dans ubuntu, accédez au "Terminal". menu et sélectionnez "Définir le codage des caractères".

Pour le mastic, Configuration - > Fenêtre - > Traduction - > UTF-8 (et si cela ne fonctionne pas, voir cet article ).

Exécutez ce code pour déterminer s'il s'agit d'un problème de compilateur ou de console:

public static void main(String[] args) throws Exception {
    String s = "¿";
    printHex(Charset.defaultCharset(), s);

    Charset utf8 = Charset.forName("UTF-8");
    printHex(utf8, s);
}

public static void printHex(Charset encoding, String s)
        throws UnsupportedEncodingException {
    System.out.print(encoding + "\t" + s + "\t");

    byte[] barr = s.getBytes(encoding);
    for (int i = 0; i < barr.length; i++) {
        int n = barr[i] & 0xFF;
        String hex = Integer.toHexString(n);
        if (hex.length() == 1) {
            System.out.print('0');
        }
        System.out.print(hex);
    }
    System.out.println();
}

Si les octets codés pour UTF-8 sont différents sur chaque plate-forme (ce doit être c2bf ), il s'agit d'un problème de compilateur.

S'il s'agit d'un problème de compilateur, remplacez " ¿" avec " \ u00bf & ; .

Il est difficile de savoir exactement quels octets votre code source contient ou la chaîne sur laquelle getBytes () est appelée, en raison de l'encodage de votre éditeur et de votre compilateur.

Pouvez-vous produire un programme court mais complet contenant uniquement du code ASCII (et le caractère \ uxxxx correspondant dans la chaîne), qui indique toujours le problème?

Je soupçonne que le problème provient peut-être de la sortie de la console sous Windows ou Linux, mais il serait bon d’avoir un programme reproductible au préalable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top