我的一个数据处理模块在读取ANSI输入时崩溃了。使用十六进制查看器查看有问题的字符串,结尾处有一个神秘的0xA0
字节。
原来这是不间断的空间。
我试过替换它:
String s = s.replace("\u00A0", "");
但它没有用。
然后我去打印出该角色使用charAt
和Java报告
65533
或0xFFFD
将其插入替换代码中,我终于摆脱了它!
但为什么我在文件中看到0xA0
,但Java将其读作0xFFFD
?
BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
String line = r.readLine();
while (line != null){
// do stuff
line = r.readLine();
}
答案 0 :(得分:5)
U+FFFD
是" Unicode替换字符",通常用于表示某些二进制数据,这些数据无法在您使用的编码中正确解码&# 34 ;. (有时会使用?
作为替代,但U + FFFD通常是一个更好的主意,因为它是明确的。)
它的出现通常表明您尝试使用错误的编码。您还没有指定 使用哪种编码 - 或者实际上您使用它的方式 - 但这可能是问题所在。检查您正在使用的编码以及文件的编码。请注意" ANSI"不是编码 - 有批次编码,称为ANSI编码,您需要为您的文件选择正确的编码。
答案 1 :(得分:0)
你是怎么打开文件的?
如果您使用InputStreamReader(InputStream, CharSet)
,则可以指定' true'您要打开的文件的charset。如果您没有自己指定charset,则java正在使用您平台的默认字符集。在unix上,这通常是UTF8,而在Windows上它通常是ISO8859。