Java InputStreamReader无法读取特殊(土耳其语)字符

时间:2016-04-19 05:48:59

标签: java file character-encoding

下面你可以看到我的代码;

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

2 个答案:

答案 0 :(得分: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

这将导致抛出异常而不是插入替换字符。

如果您仍然看到替换字符并且没​​有抛出异常,则很明显问题在于您如何查看输出。

答案 1 :(得分:0)

那么实际的文件编码是什么?打开一个十六进制编辑器,查看insan�n的字节值(特别是损坏的字符)。然后,当您有字节值时,您可以找到实际的编码。现在你已经随机尝试了两种错误的编码。