2010-04-20 6 views
1

J'utilise java io pour extraire du texte d'un serveur qui pourrait produire un caractère tel que é. puis l'affiche en utilisant System.err, ils se révèlent être '?'. J'utilise l'encodage UTF8. Qu'est-ce qui ne va pas? int len ​​= 0;lecture unicode

char[] buffer = new char[1024]; 
OutputStream os = sock.getOutputStream(); 
InputStream is = sock.getInputStream(); 
os.write(query.getBytes("UTF8"));//iso8859_1")); 

Reader reader = new InputStreamReader(is, Charset.forName("UTF-8")); 
do { 
    len = reader.read(buffer); 
    if (len > 0) { 
     if (outstring == null) { 
      outstring = new StringBuffer(); 
     } 
     outstring.append(buffer, 0, len); 
    } 
} while (len > 0); 
System.err.println(outstring); 

Edit: juste essayé le code suivant:

StringBuffer b = new StringBuffer(); 
for (char c = 'a'; c < 'd'; c++) { 
    b.append(c); 
} 
b.append('\u00a5'); // Japanese Yen symbol 
b.append('\u01FC'); // Roman AE with acute accent 
b.append('\u0391'); // GREEK Capital Alpha 
b.append('\u03A9'); // GREEK Capital Omega 

for (int i = 0; i < b.length(); i++) { 
    System.out.println("Character #" + i + " is " + b.charAt(i)); 
} 
System.out.println("Accumulated characters are " + b); 

est sorti pour être indésirable ainsi:

 
Character #0 is a 
Character #1 is b 
Character #2 is c 
Character #3 is ¥ 
Character #4 is ? 
Character #5 is ? 
Character #6 is ? 
Accumulated characters are abc¥??? 
+0

Code Reformaté; s'il vous plaît revenir si incorrect. – trashgod

+0

Bien que non lié au problème, 'StringBuilder' est préféré dans cette utilisation. – trashgod

Répondre

0

écrire à un fichier et vérifier comment il arrive. si elle arrive correctement dans le fichier, alors il y a un problème avec votre flux d'erreur (l'encodage n'est pas UTF-8). s'il y a aussi un caractère indésirable dans l'encodage de votre serveur ur peut ne pas être UTF-8.

+0

le fichier est sorti le même, mais un autre programme de référence lit et afficher le caractère unicode très bien (je n'ai pas le code source à ce programme) – user121196

+0

j'ai changé l'encodage UTF-8 dans Eclipse et exécuter le code nouvellement ajouté qu'il vient bien ... s'il vous plaît vérifier de cette façon. – sreejith

2

Tout d'abord, vérifiez que la propriété du système (file.encoding) est, en UTF8 de fait. Si c'est le cas, votre problème n'est pas le code que vous utilisez, mais votre programme terminal (ou tout autre affichage de sortie) ne peut pas rendre correctement la sortie.

0

Votre deuxième exemple produit la sortie suivante pour moi.

Character #0 is a 
Character #1 is b 
Character #2 is c 
Character #3 is ¥ 
Character #4 is Ǽ 
Character #5 is Α 
Character #6 is Ω 
Accumulated characters are abc¥ǼΑΩ 

Ce code produit un fichier UTF-8 correctement codé ayant le même contenu.

StringBuilder b = new StringBuilder(); 
for (char c = 'a'; c < 'd'; c++) { 
    b.append(c); 
} 
b.append('\u00a5'); // Japanese Yen symbol 
b.append('\u01FC'); // Roman AE with acute accent 
b.append('\u0391'); // GREEK Capital Alpha 
b.append('\u03A9'); // GREEK Capital Omega 

PrintStream out = new PrintStream("temp.txt", "UTF-8"); 
for (int i = 0; i < b.length(); i++) { 
    out.println("Character #" + i + " is " + b.charAt(i)); 
} 
out.println("Accumulated characters are " + b); 

Voir aussi: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

Questions connexes