или 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
Это приведет к выбросу исключения вместо вставленного символа замены.
Если вы все еще видите символ замены и не генерируете никаких исключений, довольно ясно, что проблема заключается в том, как вы просматриваете вывод.
Боковое примечание: не используйте '+ =' для объектов 'String'. Строки неизменяемы, и вы создаете много и много новых объектов String. Используйте 'StringBuilder' для конкатенации строк в циклах. –
Возможно ли, что консоль, которую вы используете, не поддерживает символы юникода? –
Возможно, это поможет: http://stackoverflow.com/questions/16435525/how-to-read-utf-8-encoded-file-in-java-with-turkish-characters – Pieter