2016-04-19 2 views
0

Ниже вы можете увидеть мой код;Java InputStreamReader Невозможно прочитать Специальные (турецкие) символы

final BufferedReader br = new BufferedReader(
       new InputStreamReader(new FileInputStream(f),"UTF-8"));// tried also "iso-8859-9" 
String strLine; 
while ((strLine = br.readLine()) != null) { 
    total += "\n" + strLine; 
} 
br.close(); 

Ниже приведен выход. Что мне делать?

insan�n sec�ld�g� combobox

+1

Боковое примечание: не используйте '+ =' для объектов 'String'. Строки неизменяемы, и вы создаете много и много новых объектов String. Используйте 'StringBuilder' для конкатенации строк в циклах. –

+5

Возможно ли, что консоль, которую вы используете, не поддерживает символы юникода? –

+0

Возможно, это поможет: http://stackoverflow.com/questions/16435525/how-to-read-utf-8-encoded-file-in-java-with-turkish-characters – Pieter

ответ

1

или U + FFFD символ является специальным символ определяется Unicode как «символ замены», персонаж будет отображаться, когда вы сталкиваетесь с персонажем вы не признаете, или байты данные искажены и символ не может быть прочитан.

Используемый конструктор InputStreamReader не позволяет указать поведение, когда имеются неверные данные или когда символ не распознается. Предполагается, что вы хотите, чтобы поведение по умолчанию использовалось «заменяющим символом», когда есть непризнанный символ или когда данные байта искажены, так что это может быть то, что вы видите.

Если вы изучите свой вывод и обнаружите, что ваши турецкие символы не существуют, но были заменены «заменяющим символом» U + FFFD, вы можете изменить поведение, чтобы исключить исключение вместо использования символа замены - фактическое исключение облегчит обнаружение, когда данные находятся в неправильном наборе символов.

Чтобы указать это другое поведение, используйте эту версию InputStreamReader

public InputStreamReader(InputStream in, CharsetDecoder dec) 

Для CharsetDecoder, проходят в

charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT) 
     .onUnmappableCharacter(CodingErrorAction.REPORT) 

где charset ваш набор символов выбора, например, StandardCharsets.UTF_8

Это приведет к выбросу исключения вместо вставленного символа замены.

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

0

Итак, какова фактическая кодировка файла? Откройте шестнадцатеричный редактор и посмотрите на байтовые значения для insan�n (особенно сломанный символ). Затем, когда у вас есть значение байта, вы можете найти фактическую кодировку. Теперь вы просто попробовали два неправильных кодирования наугад.

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