什么是ANSI格式?

278

什么是ANSI编码格式?它是系统默认的格式吗?它与ASCII有何不同之处?

10个回答

313

ANSI编码是一个通用术语,用于指代系统上的标准代码页,通常在Windows系统中使用。在西方/美国系统中,更应该称其为Windows-1252. (它可以在其他系统上表示某些其他Windows代码页)。本质上,这是ASCII字符集的扩展,因为它包括所有ASCII字符和额外的128个字符代码。这种差异是因为“ANSI”编码是8位而不是7位(现今几乎总是将ASCII编码为具有设置为0的MSB的8位字节)。请参阅文章以了解通常将此编码称为ANSI的原因。

名称“ ANSI”是一个误称,因为它与任何实际的ANSI标准都没有对应。但这个名字已经传开了。 ANSI与UTF-8不同。


3
我知道ANSI指的是代码页437,而不是Windows代码页1252。回想起当ANSI指的是为公告牌系统创建的图形时,我几乎可以保证这就是事实。 - Doug Moore
7
“ANSI”显然不是指任何ANSI标准,但事实上,例如在记事本中保存文件时,您可以选择“编码:ANSI”。实际问题是:“这是什么意思?” 这个答案到目前为止是最好的。 - Wernfried Domscheit
2
在我的情况下,ANSI 指的是 windows-1254 - ramazan polat
3
评论区中对于这个词究竟是什么意思的讨论,很好地展示了为什么这个非术语存在问题:它没有明确定义。 - tripleee
3
是的,尽管在现代常规定义中,“byte”通常只有一个含义,但即使在这种情况下,有时也会在特定上下文中存在一些灵活性。例如,请参见维基百科:“历史上,字节是用于在计算机中编码单个文本字符的位数”。 - Noldorin
显示剩余2条评论

67

从技术上讲,ANSI应该与US-ASCII相同。它指的是ANSI X3.4标准,这只是ANSI组织对ASCII的批准版本。在ASCII / ANSI中未定义使用设置了最高位的字符,因为它是一个7位字符集。

然而,多年来DOS和随后的Windows社区滥用该术语,使其实际含义为“正在使用的任何机器的系统代码页”。系统代码页有时也称为“mbcs”,因为在东亚系统中它可以是多字节字符编码。某些代码页甚至可以将设置了最高位的字节作为多字节序列中的尾随字节使用,因此它甚至不严格兼容纯ASCII...但即使如此,它仍被称为“ANSI”。

在美国和西欧默认设置中,“ANSI”映射到Windows代码页1252。这与ISO-8859-1不同(尽管非常相似)。在其他机器上,它可能是任何其他东西。这使得“ANSI”作为外部编码标识符完全无用。


41

严格来说,没有所谓的ANSI编码。口语上,人们使用“ANSI”这个术语表示几种不同的编码方式:

  1. ISO 8859-1
  2. Windows CP1252
  3. 在Windows机器上的当前系统编码(在Win32 API术语中)。

这是错误的。Windows 代码页1252是基于ISO 8859-1创建的,但并不完全相同。术语ANSI指的是ISO 8859-x标准。 - Patrik
3
不,它并不是这样的。有些情况下这种解释是正确的,但正如这个和其他答案所生动描绘的那样,如果没有额外的上下文,你无法确定其准确性。 - tripleee

29
从前,就像其他人一样,微软使用7位字符集,并在需要时发明了自己的字符集,但他们保留了ASCII作为核心子集。后来,他们意识到世界已经转向8位编码,而有国际标准存在,例如ISO-8859系列。在那些日子里,如果你想获得国际标准并且你住在美国,你就得从美国国家标准协会(ANSI)购买它,而ANSI会重新出版带有自己品牌和编号的国际标准(这是因为美国政府要求符合美国标准,而非国际标准)。因此,微软的ISO-8859副本上写着“ANSI”。而由于当时微软不太习惯标准,他们没有意识到ANSI还发布了许多其他标准。所以他们用“ANSI”这个封面上的名字来引用ISO-8859系列标准(以及他们发明的变体,因为他们当时真的不太理解标准),并且这个名字出现在了微软的用户文档中,因此传播给了用户社区。这大约是30年前的事情,但有时今天仍然会听到这个名称。

标准是行业的事情,因此程序员对标准还很陌生,因为这是一个新兴的行业? - CoffeDeveloper
1
微软成立时,这并不是一个新兴产业。 - Michael Kay
微软在互操作性方面存在问题和争议。当他们在1990年代末决定“拥抱和扩展”标准而不是直接回避它们时,这是一个显著的变化,但仍然不是一种负责任的适当互操作性方法。(你可以争辩说,如果你只遵循现有的标准,那么进步是不可能的,但这显然不是他们这样做的主要原因。) - tripleee

17

ASCII只定义了一个由128个符号组成的7位码页。ANSI将其扩展到8位,对于符号128到255有几个不同的代码页。

称之为ANSI是不正确的,因为实际上是ISO/IEC 8859标准定义了这些代码页。有16个代码页ISO/IEC 8859-1到ISO/IEC 8859-16。请参见ISO/IEC 8859了解更多信息。

Windows-1252再次基于ISO/IEC 8859-1,并在128到159范围内的C1控制集中进行了一些修改。维基百科指出Windows-1252也被称为带有ISO和8859之间第二连字符的ISO-8859-1。(难以置信!谁会这么做?!)


6
基本上,“ANSI”是指Windows上的旧代码页。请参见Raymond Chen在此主题上的文章:文章
引用:
源于Windows代码页1252最初基于一个ANSI草案,后来成为ISO标准8859-1。
大多数代码页中的前127个字符与ASCII相同,但上部字符有所不同。
然而,“ANSI”并不自动意味着CP1252或Latin 1。
尽管存在所有混淆,但现在您应该避免这些问题并使用Unicode。

5
如果你的电脑不是“西方”电脑,你可能不知道使用的代码页是哪个,你可以查看这个页面:国际化(NLS)API参考。(Microsoft已删除此参考,请从Web Archive中获取:国际化(NLS)API参考)。或者你可以查询你的注册表:
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:\>

2

当使用单字节字符时,ASCII格式定义了前127个字符。扩展字符从128-255由各种ANSI代码页定义,以允许对其他语言进行有限支持。为了理解ANSI编码的字符串,您需要知道它使用哪个代码页。


2
我记得“ANSI”文本曾指的是伪VT-100转义代码,可通过ANSI.SYS驱动程序在DOS中使用,以改变流式文本的流动方式......也许这不是你所指的,但如果是,请参见http://en.wikipedia.org/wiki/ANSI_escape_code

-4

ANSI(又称为Windows-1252/WinLatin1)是拉丁字母的字符编码,与ISO-8859-1相当相似。您可以在维基百科上查看它。


6
并非每个地区都使用CP1252编码;这取决于具体的地域。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接