从File - Java中读取特殊字符

nam*_*ked 3 java file-io special-characters

我正在从具有以下属性的文本文件中读取数据:

编码:ANSI
文件类型:PC

现在,该文件包含许多特殊字符,如度数符号(º)等.我正在使用以下代码读取此文件:

File file = new File("C:\\X\\Y\\SpecialCharacter.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

如果文件编码是ANSI,则上述代码不会在文件中的行之前正确读取特殊字符:
"降低热量并慢慢煮沸,直到产品达到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       ]
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

"ANSI"是不是一种特定的编码-这是一个整体集合编码.您需要在读取文件时使用正确的编码.例如,您完全有可能使用Windows-1252编码,这意味着您可能想尝试传入"Cp1252"作为编码名称.

实际上,您传入的是"UTF-8",它不是通常称为ANSI的编码之一.您需要找出文件使用的确切编码,然后在InputStreamReader参数中指定.

我的问题是,数据在什么时候搞砸了?将数据存储在文件中或从文件中读取数据时?

假设编码能够表示您感兴趣的所有字符,那么只有在您阅读文件时才能表示.基本上,你试图将它读作就像是在一个编码中,当它实际上在另一个编码中时.记事本要么执行某种启发式编码检测,要么恰好在这种特定情况下使用正确的默认值.