繁体   English   中英

从文件读取特殊字符-Java

[英]Reading special characters from File - Java

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

编码:ANSI
文件类型:PC

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

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

如果文件编码为ANSI,则上面的代码无法正确读取文件行中的特殊字符:
“降低热量并慢火煮,直到产品达到内部温度165ºF”, reader.readLine()将输出:
“降低热量并慢炖,直到产品达到内部温度165°F”

当我将文件的编码更改为UTF-8时,该行将按文件中的原样进行读取,而不会弄乱特殊字符。

我的问题是,数据什么时候弄乱了? 将数据存储在文件中还是从文件中读取数据? 在记事本中打开文件会正确显示所有特殊字符。 这是怎么发生的?

十六进制转储输出:

          -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       ]

“ ANSI”不是特定的编码-它是编码的完整集合 读取文件时,您需要使用正确的编码。 例如,您完全有可能使用Windows-1252编码,这意味着您可能想尝试传递“ Cp1252”作为编码名称。

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

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

假设编码能够代表您感兴趣的所有字符,那么仅当您读取文件时才可以。 基本上,您试图读取它,就像它实际上是另一种编码一样。 记事本正在执行某种启发式编码检测,或者恰好在这种特定情况下使用正确的默认值。

new InputStreamReader(new FileInputStream(file), "UTF-8")用于读取UFT-8编码的文件:如果您要读取编码不同的文件(例如Win 1252),则应相应地更改第二个参数。

文本文件永远不会“陷入混乱”地进行编码:它以某种编码存储,并且在读取文本文件时应使用相同的编码,以便系统可以解释该原始字节流并关联每个[字节组] [s]带有正确的字符[或Unicode代码点,如果我们正在执行Unicode],则可以看到“正确的”字形。

希望这可以澄清一点。

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM