2016-08-24 4 views
0

Je suis en train de faire des tests avec le fichier CSV de sortie pour le format Shift-JIS, mais en quelque sorte je l'ai trouvé bizarre sur les essais des différences de caractères japonais comme ci-dessous:Java écrire fichier de format Shift-JIS CSV

Mon code :

try { 
     String dat2 = "カヨ ハラダ"; 
     String dat = "2バイト文字出力"; 
     String fileName = "C:/Users/CR/Desktop/test2.txt"; 

     FileOutputStream fos = new FileOutputStream(fileName); 
     OutputStreamWriter osw = new OutputStreamWriter(fos, "Shift_JIS"); 
     BufferedWriter fp = new BufferedWriter(osw); 

     fp.write(new String(dat2.getBytes("Shift_JIS")); 
     fp.newLine(); 

     fp.flush(); 
     fp.close(); 
     fos.close(); 

    } catch (Exception ex) { 
     throw new Exception(ex); 
    } 

Résultat DAT2:

It was not in Shift-JIS formt

Il n'a pas été en format Shift-JIS et les mots sont trop incorrectes où par un autre essai:

Résultat dat:

enter image description here

Cela peut être affiché correctement et dans le format attendu trop.

Quelque chose s'est mal passé? ou le contenu n'est pas correct?

Merci!

+0

À l'avenir, vous voudrez peut-être ouvrir le fichier dans un éditeur japonais comme Sakura car Notepad ++ a tendance à ignorer les encodages et à faire tout ce qu'il veut avec les fichiers contenant des caractères japonais. Même en changeant les paramètres pour supposer que UTF-8/SJIS a encore le mauvais choix la plupart du temps (au moins pour moi) et cela a conduit à 文字 化 け similaire à votre message apparaissant dans Notepad ++ mais pas Sakura. –

Répondre

0

La plupart de votre code est bon, sauf pour la ligne:

fp.write(new String(dat2.getBytes("Shift_JIS")); 

chaînes Java sont (plus ou moins) codant neutre. L'encodage entre en jeu lorsque vous écrivez la chaîne dans un fichier (ou l'envoyez sur le net). Dans votre cas, la conversion d'encodage est gérée par le OutputStreamWriter que vous avez configuré correctement.

Ainsi, la ligne devient plus simple:

fp.write(dat2); 

BTW:

L'expression

new String(dat2.getBytes("Shift_JIS") 

convertit d'abord la chaîne dat2 dans un tableau d'octets dans Shift_JIS codage et convertit ensuite les octet tableau dans une chaîne en utilisant le codage par défaut (probablement UTF-8), décodant ainsi l'octet a rayer en utilisant le mauvais encodage.

P.S.

Encore une chose. Les fichiers texte comme les fichiers CSV n'ont aucun moyen d'indiquer quel encodage a été utilisé pour les écrire (exception: UTF avec BOM). Il n'y a que des heuristiques pour faire une bonne estimation. Ainsi, lorsque vous les ouvrez dans un éditeur de texte, vous devez vérifier s'ils ont été ouverts avec le codage correct et le corriger si nécessaire. Dans votre première capture d'écran, il est indiqué "ANSI" dans la barre d'état. C'est à peine ce que tu veux.

+0

Salut Codo, Merci pour votre signalement mais malheureusement le résultat reste le même. :( – crchin

+0

Avez-vous ouvert le fichier avec l'encodage Shift-JIS dans l'éditeur de texte ou utilise-t-il toujours l'encodage ANSI? – Codo

+0

Par défaut, le fichier avec dat est ouvert dans npp et il apparaît automatiquement dans Shift-JIS. – crchin

0

Il semble que le problème soit causé par le mot japonais - Caractères Katakana pleine largeur ou demi-largeur.

Pour mon échantillon donné au-dessus, le dat est en pleine largeur et DAT2 est en demi-largeur.

J'essaie donc d'utiliser ICU4J pour convertir la demi-largeur en pleine largeur, puis il peut écrire avec succès en format CSV avec le format Shift-JIS.

Transliterator transliterator = Transliterator.getInstance("Halfwidth-Fullwidth"); 
String converted = transliterator.transliterate("カヨ ハラダ"); 

The result as below : 
カヨ ハラダ 
0

j'exécuter le programme ci-dessous:

import java.io.*; 

public class Hoge { 
    public static void main(String[] args) { 
     try { 
      { 
       String dat = "2バイト文字出力"; 
       String fileName = "./FullWidth.txt"; 

       FileOutputStream fos = new FileOutputStream(fileName); 
       OutputStreamWriter osw = new OutputStreamWriter(fos, "Shift_JIS"); 
       BufferedWriter fp = new BufferedWriter(osw); 

       fp.write(new String(dat.getBytes("Shift_JIS"))); 
       fp.newLine(); 

       fp.flush(); 
       fp.close(); 
       fos.close(); 
      } 
      { 
       String dat2 = "カヨ ハラダ"; 
       String fileName = "./HalfWidth.txt"; 

       FileOutputStream fos = new FileOutputStream(fileName); 
       OutputStreamWriter osw = new OutputStreamWriter(fos, "Shift_JIS"); 
       BufferedWriter fp = new BufferedWriter(osw); 

       fp.write(new String(dat2.getBytes("Shift_JIS"))); 
       fp.newLine(); 

       fp.flush(); 
       fp.close(); 
       fos.close(); 
      } 
     } catch (Exception ex) { 
      // NOP 
     } 
    } 
} 

Le contenu de FullWidth.txt est (en hexadécimal):

3F 51 3F 6F 3F 43 3F 67 3F 3F 3F 3F 3F 6F 3F 3F 0A 

La chaîne 2バイト dans le codage Shift JIS doit être 82 51 83 6F 83 43 83 67. Donc, je pense que Notepad ++ a reconnu l'encodage comme Shift JIS, et en quelque sorte récupéré le premier octet de chaque caractère.

D'autre part, le contenu de HalfWidth.txt est (en hexadécimal):

3F 3F 20 3F 3F 3F 3F 0A 

Je pense donc que Notepad ++ ne pouvait pas reconnaître l'encodage de ce fichier.

En résumé: Les deux fichiers sont incorrects. Accidentellement Notepad ++ pourrait récupérer le contenu d'un fichier, et n'a pas pu récupérer le contenu de l'autre fichier.