我对编码/字符集有疑问。
我做了一个测试。在 Notepad++ 中输入字符串“TEST Á”(不带引号),并使用 ANSI 编码。
“对于 ASCII 字符(例如数字 0-9 以及英文字母 az 和 AZ),ANSI 字符集都是相同的”(http://www.firstobject.com/convert-ansi-file-to-unicode.htm)
令我惊讶的是,notepad++ 正常保存了文件,我可以在 notepad++ 上正常读取它,并使用 Ansi 编码进行加重。
其他测试,我用HxD打开了同一个文件(http://mh-nexus.de/en/hxd/),我的文件也是正确的,文件末尾有拉丁字符“Á”。参见下面的十六进制:
54 45 53 54 20 C1 -> 测试 Á
我认为应该使用 UTF-8 编码来实现这一点,但这不是必需的。
谁能向我解释这是如何可能的?
答案1
您可以使用任何字符集和任何编码来创建文件并查看它。
您只需确保在查看时使用与写入文件时相同的设置和编码。
大多数字符集实际上有很大的重叠。例如,大多数字符集(不包括 EBCDIC 和其他字符集)的 ASCII 字符集与 ASCII 位于相同的位置(即具有相同的代码点)。因此,您可以使用 UTF-8 编码在 Unicode 字符集中编写文件,只要文件仅包含 ASCII 中的字符,您就可以使用 Windows Latin-1 编码查看该文件。
注意:微软对“ANSI”和“Unicode”等术语的使用非常马虎。
更新:
至于你的 Á,请参阅此摘录这里
Dec Hex ASC PC 437 850 Win Lat1 Uni
192 00C0 └ └ └ À À À
193 00C1 ┴ ┴ ┴ Á Á Á
194 00C2 ┬ ┬ ┬ Â Â Â
195 00C3 ├ ├ ├ Ã Ã Ã
196 00C4 ─ ─ ─ Ä Ä Ä
197 00C5 ┼ ┼ ┼ Å Å Å
请注意,Á 在 Windows Latin-1、ISO 8859-1 Latin 1 和 Unicode / ISO 10646 中位于代码点 194 (0xC1)。如果您在 Windows Latin-1 中写入 Á,则可以将其视为 ISO 8859-1。
如果你尝试将其读取为 Unicode,则会遇到问题,因为 Unicode 编码使用多个字节来表示该字符,
# echo $LANG
en_US.UTF-8
# cat t
TEST Á
# hexdump -C t
00000000 54 45 53 54 20 c3 81 0a |TEST ...|
00000008
请注意,Á(Unicode 代码点 00C1)在 UTF-8 中编码为 c3 81
答案2
Notepad++ 中的默认编码称为“ANSI”,没有明确说明;这可能意味着窗户-1252,或者它可能意味着任何 8 位编码都是系统的本机 8 位编码(在您的例子中,它可能是 windows-1252)。“ANSI”是 Microsoft 对其 8 位编码的误称,其中一种(现在称为 windows-1252)很久以前就已提交给美国国家标准协会审批 - 但遭到拒绝。
在 windows-1252 编码中输入“Á”没有问题。当然,Notepad++ 也显示正常。许多其他程序也是如此。
例如,如果您想输入“Ć”,则需要 UTF-8。许多人即使现在不需要 windows-1252 以外的字符,也会使用 UTF-8,以避免以后添加新字符时需要更改编码。