我正在从具有以下属性的文本文件中读取数据:
编码:ANSI
文件类型:PC
现在,该文件包含许多特殊字符,如度数符号(º)等。我正在使用以下代码读取此文件:
File file = new File("C:\\X\\Y\\SpecialCharacter.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
如果文件编码是ANSI,则上述代码不能正确读取特殊字符e.x.文件中的行:
“降低热量并慢慢煮至产品达到内部温度165ºF”,reader.readLine()
将输出:
“降低热量并慢慢煮至产品达到内部温度165°F”
当我将文件的编码更改为UTF-8时,该行会在文件中读取,而不会弄乱特殊字符。
我的问题是,数据在什么时候搞砸了?将数据存储在文件中或从文件中读取数据时?在记事本中打开文件会正确显示所有特殊字符。这是怎么发生的?
Hexdump输出:
-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F
00000000- 4C 6F 77 65 72 20 68 65 61 74 20 61 6E 64 20 73 [Lower heat and s]
00000001- 69 6D 6D 65 72 20 75 6E 74 69 6C 20 70 72 6F 64 [immer until prod]
00000002- 75 63 74 20 72 65 61 63 68 65 73 20 69 6E 74 65 [uct reaches inte]
00000003- 72 6E 61 6C 20 74 65 6D 70 65 72 61 74 75 72 65 [rnal temperature]
00000004- 20 6F 66 20 31 36 35 BA 46 [ of 165.F ]
答案 0 :(得分:9)
" ANSI"不是特定的编码 - 它是编码的整个集合。在读取文件时,您需要使用 right 编码。例如,您完全有可能使用Windows-1252编码,这意味着可能想要尝试传入" Cp1252"作为编码名称。
事实上,你正在传入" UTF-8"其中不是其中一种编码,通常称为ANSI。您需要找出文件使用的确切编码,然后在InputStreamReader
参数中指定。
我的问题是,数据在什么时候搞砸了?将数据存储在文件中或从文件中读取数据时?
假设编码能够表示您感兴趣的所有字符,则只有在您阅读文件时才能表示。基本上,您尝试阅读它就好像它在一个编码中,当它实际上在另一个编码中时。记事本要么执行某种启发式编码检测,要么在这种特殊情况下使用正确的默认 。
答案 1 :(得分:1)
new InputStreamReader(new FileInputStream(file), "UTF-8")
用于读取UFT-8
- 编码文件:如果您正在读取不同编码的文件(例如Win 1252),则应相应更改第二个参数。
文本文件永远不会“乱码”编码:它以某种编码方式存储,您在读取时应使用相同的编码,以便系统可以解释该原始字节流并关联每个[组如果字节[s]具有正确的字符[或Unicode代码点,如果我们正在执行Unicode],则可以看到“正确”的字形。
希望这澄清一点。
干杯