Подтвердить что ты не робот

Parse CSV файл, содержащий символ Unicode с использованием OpenCSV

Я пытаюсь разобрать CSV файл с OpenCSV в NetBeans 6.0.1. Мой файл содержит символ Unicode. Когда я пишу его в выводе, символ появляется в другой форме, например (HJ1'-E/;). Когда я открываю этот файл в "Блокноте", он выглядит нормально.

Код, который я использовал:

CSVReader reader=new CSVReader(new FileReader("d:\\a.csv"),',','\'',1);
    String[] line;
    while((line=reader.readNext())!=null){
        StringBuilder stb=new StringBuilder(400);
        for(int i=0;i<line.length;i++){
            stb.append(line[i]);
            stb.append(";");
        }
        System.out.println( stb);
    }
4b9b3361

Ответ 1

Сначала вам нужно знать, что такое кодировка вашего файла, например UTF-8 или UTF-16. С чего начинается этот файл?

После этого это относительно просто - вам нужно создать FileInputStream, завернутый в InputStreamReader, а не только FileReader. (FileReader всегда использует кодировку по умолчанию для системы.) Укажите кодировку, которая будет использоваться при создании InputStreamReader, и если вы выбрали правильный, все должно начать работать.

Обратите внимание, что вам не нужно использовать OpenCSV, чтобы проверить это - вы можете просто прочитать текст файла самостоятельно и распечатать все. Я не уверен, что я бы доверял System.out, чтобы иметь возможность обрабатывать символы, отличные от ASCII, хотя, возможно, вы захотите найти другой способ изучения строк, например, распечатать отдельные значения символов в виде целых чисел (предпочтительно в шестнадцатеричном формате), а затем сравнивая их с диаграммами на unicode.org. С другой стороны, вы можете попробовать правильную кодировку и посмотреть, с чего начать...

EDIT: Хорошо, поэтому, если вы используете UTF-8:

CSVReader reader=new CSVReader(
    new InputStreamReader(new FileInputStream("d:\\a.csv"), "UTF-8"), 
    ',', '\'', 1);
String[] line;
while ((line = reader.readNext()) != null) {
    StringBuilder stb = new StringBuilder(400);
    for (int i = 0; i < line.length; i++) {
         stb.append(line[i]);
         stb.append(";");
    }
    System.out.println(stb);
}

(Надеюсь, у вас есть блок try/finally, чтобы закрыть файл в вашем реальном коде.)