【问题标题】:Java InputStreamReader Can not read Special(Turkish) CharactersJava InputStreamReader 无法读取特殊(土耳其语)字符
【发布时间】:2016-04-19 05:48:58
【问题描述】:

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

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

【问题讨论】:

  • 旁注:不要将+= 用于String 对象。字符串是不可变的,您正在创建许多新的 String 对象。使用StringBuilder 在循环中连接字符串。
  • 您使用的控制台可能不支持Unicode字符吗?

标签: java file character-encoding


【解决方案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

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

如果您仍然看到替换字符并且没​​有引发异常,则很明显问题出在您查看输出的方式上。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多