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

l5tcr1uw  于 2023-05-15  发布在  Java
关注(0)|答案(3)|浏览(123)

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

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

ffx8fchx

ffx8fchx1#

或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
这将导致引发异常,而不是插入替换字符。
如果仍然看到替换字符并且没有抛出异常,那么很明显问题出在如何查看输出上。

6jjcrrmo

6jjcrrmo2#

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

kmb7vmvb

kmb7vmvb3#

Cp1254编码是您正在寻找的编码特殊土耳其字符。

final BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream(f),"Cp1254"));

相关问题