2008-10-06 15 views

Répondre

15

System.out.println() affiche le texte dans le codage par défaut du système, mais la console interprète cette sortie en fonction de son propre réglage de codage (ou « code »). Sur votre machine Windows, les deux encodages semblent correspondre, mais sur la machine Linux, la sortie est apparemment en UTF-8 tandis que la console est en train de le décoder comme un codage à un octet comme ISO-8859-1. Ou peut-être, comme Jon l'a suggéré, le fichier source est en train d'être enregistré en UTF-8 et javac le lit comme quelque chose d'autre, un problème qui peut être évité en utilisant des échappements Unicode.Lorsque vous avez besoin de produire autre chose que du texte ASCII, il est préférable de l'écrire dans un fichier en utilisant un encodage approprié, puis de lire le fichier avec un éditeur de texte - les consoles sont trop limitées et trop dépendantes du système. En passant, ce bit de code:

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

... n'a aucun effet sur la sortie. Tout ce que cela fait est d'encoder 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 no-op coûteux. Si vous voulez sortir du texte dans un encodage particulier, vous devez utiliser un OutputStreamWriter, comme ceci:

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

Il est difficile de savoir exactement quels octets votre code source contient, ou la chaîne qui getBytes () est appelée, en raison de votre éditeur et des encodages du compilateur.

Pouvez-vous produire un programme court mais complet contenant uniquement l'ASCII (et pertinents \ uxxxx échapper à la chaîne) qui montre encore le problème?

Je soupçonne que le problème pourrait bien être avec la sortie de la console sur Windows ou Linux, mais il serait bon d'obtenir un programme reproductible en premier.

8

Je ne sais pas où le problème est exactement, mais il est intéressant de noter que

¿ (0xc2,0xbf)

est le résultat de l'encodage UTF-8

0xbf,

Donc, il semble que dans le cas de linux, la sortie ne soit pas affichée comme utf-8, mais comme un strin à un octet, ce qui est le code Unicode pour ¿

g

+0

+1. J'ai récemment vu   affiché comme C2A0 et est allé wtf. – Amarghosh

6

Vérifiez le codage de votre terminal Linux. Pour le terminal gnome dans ubuntu - allez dans le menu "Terminal" et sélectionnez "Set Character Encoding".

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

2

Exécutez ce code pour déterminer si elle est un compilateur ou un problème 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érentes sur chaque plate-forme (il devrait être c2bf), il est un problème de compilateur.

S'il est un problème de compilateur, remplacer « ¿ » avec "\u00bf".