什么是ANSI编码格式?它是系统默认格式吗?它与 ASCII 有什么不同?
10 回答
ANSI 编码是一个稍微通用的术语,用于指代系统上的标准代码页,通常是 Windows。在西方/美国系统上,它更恰当地称为Windows-1252 。(它可以表示其他系统上的某些其他Windows 代码页。)这本质上是 ASCII 字符集的扩展,因为它包括所有 ASCII 字符以及额外的 128 个字符代码。这种差异是由于“ANSI”编码是 8 位而不是 ASCII 的 7 位(如今 ASCII 几乎总是编码为MSB设置为 0 的 8 位字节)。请参阅文章以了解为什么此编码通常称为 ANSI。
“ANSI”这个名字用词不当,因为它不符合任何实际的 ANSI 标准,但这个名字一直存在。ANSI 与 UTF-8 不同。
从技术上讲,ANSI 应该与 US-ASCII 相同。它指的是 ANSI X3.4 标准,它只是ANSI组织批准的 ASCII 版本。ASCII/ANSI 中没有定义高位集字符的使用,因为它是一个 7 位字符集。
然而,多年来 DOS 和随后的 Windows 社区对该术语的误用已使其实际含义成为“正在使用的任何机器的系统代码页”。系统代码页有时也称为“mbcs”,因为在东亚系统上,它可以是每个字符多字节的编码。一些代码页甚至可以使用高位清除字节作为多字节序列中的尾随字节,因此它甚至不与纯 ASCII 严格兼容……但即便如此,它仍然被称为“ANSI”。
在美国和西欧的默认设置中,“ANSI”映射到 Windows 代码页 1252。这与 ISO-8859-1 不同(尽管非常相似)。在其他机器上,它可能是其他任何东西。这使得“ANSI”作为外部编码标识符完全无用。
严格来说,不存在 ANSI 编码之类的东西。通俗地说,术语 ANSI 用于几种不同的编码:
- ISO 8859-1
- 视窗 CP1252
- Windows 机器上的当前系统编码(在 Win32 API 术语中)。
曾几何时,微软和其他所有人一样,使用 7 位字符集,并在适合他们的时候发明了自己的字符集,尽管他们将 ASCII 作为核心子集。然后他们意识到世界已经转向 8 位编码,并且周围有国际标准,例如 ISO-8859 系列。在那个年代,如果你想获得一个国际标准并且你住在美国,你从美国国家标准协会 (ANSI) 那里购买它,它以自己的品牌和编号重新发布国际标准(那是因为美国政府想要符合美国标准,而非国际标准)。所以微软的 ISO-8859 副本在封面上写着“ANSI”。而且因为当时微软还不太习惯标准,所以他们没有 没有意识到 ANSI 还发布了许多其他标准。因此,他们通过封面上的名称“ANSI”引用了 ISO-8859 系列中的标准(以及他们发明的变体,因为当时他们并不真正了解标准),并且它进入了微软用户文档,从而进入用户社区。那是大约 30 年前的事了,但今天你仍然有时会听到这个名字。
ASCII只是定义了一个包含 128 个符号的 7 位代码页。ANSI 将其扩展到 8 位,符号 128 到 255 有几个不同的代码页。
命名 ANSI 是不正确的,因为它实际上是定义此代码页的 ISO/IEC 8859 规范。请参阅ISO/IEC 8859以供参考。ISO/IEC 8859-1 到 ISO/IEC 8859-16 共有 16 个代码页。
Windows-1252再次基于 ISO/IEC 8859-1,主要在 128 到 159 范围内的C1 控制范围内进行了一些修改。维基百科指出 Windows-1252 也称为 ISO-8859-1,第二个ISO 和 8859 之间的连字符。(难以置信!谁会这样做?!?)
基本上,“ANSI”指的是 Windows 上的旧代码页。另请参阅Raymond Chen关于此主题的文章:
其根源在于 Windows 代码页 1252 最初基于 ANSI 草案,该草案成为 ISO 标准 8859-1。
在大多数代码页中,前 127 个字符与 ASCII 相同,但上面的字符有所不同。
但是,ANSI 并不自动表示 CP1252 或拉丁语 1。
尽管您现在应该简单地避免此类问题并使用Unicode,但所有的混乱。
万一您的 PC 不是“西方”PC,并且您不知道使用哪个代码页,您可以查看此页面:国家语言支持 (NLS) API 参考
[Microsoft 删除了此参考,取自 web-archive National Language Support (NLS) API Reference
或者您可以查询您的注册表:
C:\>reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /f ACP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
ACP REG_SZ 1252
End of search: 1 match(es) found.
C:\>
使用单字节字符时,ASCII 格式定义前 127 个字符。128-255 的扩展字符由各种 ANSI 代码页定义,以允许对其他语言的有限支持。为了理解 ANSI 编码的字符串,您需要知道它使用哪个代码页。
我记得当“ANSI”文本提到伪 VT-100 转义码时,可通过 ANSI.SYS 驱动程序在 DOS 中使用以改变流文本的流...... //en.wikipedia.org/wiki/ANSI_escape_code
ANSI(又名 Windows-1252/WinLatin1)是拉丁字母的字符编码,与ISO-8859-1非常相似。您可能想在 Wikipedia 上查看它。