2013-03-20 4 views
2

Я пытаюсь извлечь данные из TXT-файла, который был закодирован в Юникоде, потому что в нем есть акценты (французские имена). Ниже приведена часть моего кода. Вывод строки postalCode имеет в ней странные маленькие квадраты (squareHsquare1square). Мое подозрение в том, что проблема связана с тем, что программа обрабатывает контент как ASCII. Кто-то, пожалуйста, указывайте мне в правильном направлении. Благодаря!Чтение unicode txt в java

Scanner in = new Scanner(new FileReader("postal_codes.txt")); 
currentLine = in.nextLine(); 

//take first 6 char --> store as variable 
postalCode = currentLine.substring(0, 5); 
+1

Что вы имеете в виду «закодированный в Unicode "? Unicode не является кодировкой. –

+0

@ R.MartinhoFernandes Извините, если это утверждение было неверным; Я не гений. Я думаю, вы можете догадаться, что я имею в виду. – Ishikawa

+0

Дело в том, что я не могу. Я могу сделать несколько образованных догадок, но нет никакого способа точно знать, какой он есть. –

ответ

3

Если вы читали Javadoc для FileReader, он говорит (курсив мой):

Конструкторы этого класса предположить, что кодирование характер по умолчанию и размер по умолчанию байт буфера являются подходящими. Чтобы сами определить эти значения, создайте InputStreamReader в FileInputStream.

Другими словами, вам нужно использовать:

new Scanner(new InputStreamReader(
    new FileInputStream("postal_codes.txt"), StandardCharsets.UTF_8)); 
+0

И победитель Марк! Спасибо огромное! – Ishikawa

0

Вы можете попробовать это:

BufferedReader in = new BufferedReader(new FileReader("postal_codes.txt", "UTF-8"))); 
String content = in.readLine(); 
postalCode = content.substring(0, 5); 
+2

['BufferedReader'] (http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html) не имеет конструктора, который принимает набор символов. –

+0

Марк прав, не мог заставить его работать. – Ishikawa

+0

Спасибо, исправил его. – Alp

3

Это звучит как вопрос кодирования. Я предполагаю, что «закодировано в Юникоде» означает «закодировано в UTF-8». Попробуйте это:

Scanner in = new Scanner(
    new InputStreamReader(new FileInputStream("postal_codes.txt"), "UTF-8")); 

FileReader автоматически использует кодировку по умолчанию для платформы. Это часто не UTF-8.

+0

Спасибо, я думал, что это решит проблему, но выход такой же. – Ishikawa

+1

@James - Попробуйте другие кодировки. Если каждый другой символ странный, то, возможно, файл был сохранен как UTF-16 (или UTF-16LE или UTF-16BE). Лучше всего было бы точно определить, какая кодировка использовалась для генерации файла. –

+0

Спасибо @TedHopp, этот комментарий также помог решить проблему. – Ishikawa

1

Вы можете использовать гуавы, метод:

Files.readLines(File file Charset charset) : List<String> 

пакета

com.google.common.io.Files; 
Смежные вопросы