2016-08-24 26 views
0

В настоящее время я делаю некоторое тестирование с файлом вывода CSV для формата Shift-JIS, но почему-то я нашел, что это странно, на испытаниях различий японских символов, как показано ниже:Java записи Shift-JIS CSV формат файла

Мой код :

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); 
    } 

Результат для dat2:

It was not in Shift-JIS formt

Это было не в формате Shift-JIS, а слова неверны тоже где на другом испытании:

Результат для ДАТ:

enter image description here

Это может быть корректно отображаться и в ожидаемом формате тоже.

Все пошло не так? или содержимое неверно?

Спасибо!

+0

В будущем вы можете открыть файл в японском редакторе, таком как Sakura, поскольку Notepad ++ имеет тенденцию игнорировать кодировки и делать все, что ему нравится, с файлами, содержащими японские символы. Даже изменение настроек, чтобы предположить, что UTF-8/SJIS по-прежнему предпочитает неправильную большую часть времени (по крайней мере для меня), и это привело к тому, что 文字 化 け похож на ваш пост, появляющийся в Notepad ++, но не на Sakura. –

ответ

0

Большинство кода хорошо для строки, за исключением:

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

Java строки (более или менее), кодирующего нейтралью. Кодирование вступает в игру, когда вы пишете строку в файл (или отправляете ее по сети). В вашем случае преобразование кодировки обрабатывается OutputStreamWriter, который вы правильно настроили.

Таким образом, линия становится проще:

fp.write(dat2); 

КСТАТИ:

Выражение

new String(dat2.getBytes("Shift_JIS") 

сначала преобразует строку dat2 в массив байтов в Shift_JIS кодирования, а затем преобразует байтовый массив в строку с использованием кодировки по умолчанию (возможно, UTF-8), тем самым расшифровывая байт a rray, используя неправильную кодировку.

P.S.

Еще одна вещь. Текстовые файлы, такие как CSV-файлы, не могут указать, какая кодировка использовалась для их записи (исключение: UTF с BOM). Есть только эвристика, чтобы сделать хорошее предположение. Поэтому, когда вы открываете их в текстовом редакторе, вы должны проверить, были ли они открыты с правильной кодировкой и при необходимости исправить. В первом снимке экрана в строке состояния говорится «ANSI». Это вряд ли то, что вы хотите.

+0

Привет, Codo, Спасибо за то, что вы указали, но, к сожалению, результат все тот же. :( – crchin

+0

Вы открыли файл с кодировкой Shift-JIS в текстовом редакторе. Или он все еще использует кодировку ANSI? – Codo

+0

По умолчанию файл с dat открывается в npp и автоматически отображается в Shift-JIS. Оба файла должны вести себя одинаково. Не так ли? – crchin

0

Похоже, проблема связана с японским словом - полной шириной или половиной ширины персонажей Катакана.

Для моего образца приведены на выше, DAT в полную ширину, и dat2 в половину ширины.

Поэтому я пытаюсь использовать ICU4J для преобразования полуширины в полную ширину, после чего он может успешно записывать в CSV формат Shift-JIS.

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

The result as below : 
カヨ ハラダ 
0

Я запустить программу ниже:

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 
     } 
    } 
} 

Содержание FullWidth.txt является (в шестнадцатеричном):

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

Строка 2バイト в кодировке Shift JIS должно быть 82 51 83 6F 83 43 83 67. Поэтому я думаю, что Notepad ++ распознал кодировку как Shift JIS и каким-то образом восстановил первый байт каждого символа.

С другой стороны, содержание HalfWidth.txt является (в шестнадцатеричном виде):

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

Так что я думаю, что Notepad ++ не может распознать кодировку этого файла.

Вкратце: оба файла являются неправильными. Случайно Notepad ++ мог восстановить содержимое одного файла и не смог восстановить содержимое другого файла.

 Смежные вопросы

  • Нет связанных вопросов^_^