Windows-1252和ISO-8859-1之间的确切区别是什么?

45

我们正在基于Debian的LAMP安装上托管PHP应用程序。 一切都很好-在性能、管理和维护方面都很不错。 然而,作为一些新开发人员(我们还在读高中),我们遇到了一些关于西方字符集的字符编码问题。

经过大量研究,我得出结论,网上的信息有些令人困惑。 它谈论的是Windows-1252是ANSI和完全兼容ISO-8859-1。

那么,Windows-1252(1/3/4)和ISO-8859-1之间有什么区别呢?
ANSI又与此有何关系呢?

为了确保客户以预期的方式获得所有信息,并且我们不会在途中丢失任何字符,我们应该在我们的Debian服务器(和工作站)上使用哪种编码呢?

5个回答

42
我希望以更符合网络语言的方式回答这个问题,为了回答这个问题,我们需要了解一些历史背景。Joel Spolsky 写了一篇非常好的入门文章,介绍了每个开发者都应该了解的 Unicode 字符编码的绝对最低要求。
请您稍等片刻,因为这将是一个相当冗长的答案。 :)
作为历史背景,我将引用他的一些引述:(非常感谢 Joel! :) )
唯一重要的字符是好老的无重音英文字母,我们有一个叫做ASCII的代码来表示它们,能够使用32到127之间的数字来表示每个字符。空格是32,字母“A”是65,等等。这可以方便地存储在7位中。那时候大多数计算机都使用8位字节,因此不仅可以存储每个可能的ASCII字符,而且还有一个整整的比特可以节省下来,如果你很邪恶,可以用于自己的阴险目的。

一切都很好,假设你是一个英语使用者。 因为字节可以容纳多达八个比特,许多人开始思考,“哎呀,我们可以使用128-255的代码来实现自己的目的。”问题在于,许多人同时想到了这个主意,并且他们对128到255之间的空间中应该放什么有自己的想法。

所以现在PC上分发“OEM字符集”,这些字符集仍然各不相同、不兼容。令我们当代感到惊讶的是——这一切都没问题!当时他们没有互联网,人们很少在不同区域的系统之间交换文件。

Joel继续说:

事实上,自从人们在美国以外购买电脑之后,各种不同的OEM字符集被想出来了,它们都使用前128个字符来满足自己的需要。最终,这种OEM的自由竞争在ANSI标准中得到了规范。在ANSI标准中,大家都同意在128以下怎么做,基本上与ASCII相同,但是在128及以上的字符处理方面,因所处地区而异,有许多不同的处理方式。这些不同的系统被称为代码页
这就是“Windows代码页”最终诞生的过程。它们实际上是由DOS代码页“孕育”而来的。然后Unicode诞生了! :) UTF-8 是“另一种存储Unicode代码点字符串的系统”,实际上“0-127之间的每个代码点都存储在单个字节中”,与ASCII相同。我不会再进一步解释Unicode和UTF-8,但您应该阅读有关BOM字节序字符编码的一般信息。
在“ANSI阴谋论”中,微软实际上承认了Windows-1252的错误标记,并在术语词汇表中解释:

所谓的Windows字符集(WinLatin1或Windows代码页1252)使用其中一些位置用于可打印字符。因此,Windows字符集与ISO 8859-1不完全相同。Windows字符集经常被称为“ANSI字符集”,但这是非常误导人的。它没有得到ANSI的批准。

因此,指的是Windows字符集时,ANSI未经过认证!:)

正如Jukka所指出的(感谢您提供精彩的答案)

“Windows-1252 ISO Latin 1”也称为ISO-8859-1字符编码,因此在ISO-8859-1中,代码范围0x80到0x9F保留为控制字符(所谓的C1控制字符),而在Windows-1252中,其中一些代码被分配给可打印字符(大多是标点符号字符),其他未定义。然而,我的个人观点和技术理解是,Windows-1252和ISO-8859-1都不是Web编码! :) 所以:
  • 对于网页,请使用UTF-8编码来存储内容。同时,通过HTTP Header: Content-Type: text/html; charset=utf-8输出。

    还有一种叫做HTML内容类型元标记的东西: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 当浏览器遇到这个标记时,会重新从HTML文档的开始处进行解释,以便使用声明的编码方式解释文档。只有在没有“内容类型”头时才会发生这种情况。

  • 如果您的系统用户需要生成文件,请使用其他特定的编码方式。例如,某些西方用户可能需要使用Windows-1252的Excel生成文件或CSV。如果是这种情况,请以该区域设置的编码方式编码文本,然后将其存储在fs上并作为可下载文件提供。

  • 设计HTTP时还要注意另一件事情: 内容编码分发机制应该遵循以下步骤:

    I.客户端通过“接受”和“接受字符集”request headers请求特定内容类型和编码的网页。

    II.然后服务器(或Web应用程序)返回转码为该编码和字符集的内容。

在大多数现代Web应用程序中并非如此。实际上,Web应用程序会强制客户端使用UTF-8来提供内容。这样做的原因是浏览器根据响应头而不是实际预期对接收到的文档进行解释。
我们应该全部采用Unicode编码,所以请尽可能和最适用的情况下使用UTF-8来分发您的内容。否则互联网长者会来找你! :)
附注: 有关在Web页面中使用MS Windows字符的更多好文章可以在这里这里找到。

1
非常感谢您提供如此好的答案。通过您提供的链接,我已经创建了一个包含所有可能编码字符串的数组。虽然不确定它是否有用,但还是分享一下这个链接,希望对像我一样的随机网民有所帮助:https://gist.github.com/liesislukas/d7c4bcd0e8b83aef084d8d269fbd7ba7 - Lukas Liesis
1
@LukasLiesis 很高兴知道它有所帮助。 - Borislav Sabev
太棒了。也许在笑脸附近加入一点关于Unicode和UTF-8的介绍?例如:“Unicode为1,114,112个字符分配了一个编号,就像ASCII在1980年为127个字符分配了编号一样。我们如何将这些更大的数字存储在多个字节中(以形成一个字符串)被称为UTF-8。” - undefined

17
最权威的字符编码名称定义参考是IANA注册表Character Sets

Windows-1252通常被称为Windows Latin 1或Windows西欧等。它与ISO Latin 1(也称为ISO-8859-1)作为字符编码有所不同,因为ISO-8859-1的编码范围0x80到0x9F保留为控制字符(即所谓的C1控件),而在Windows-1252中,其中一些代码分配给可打印字符(大多数是标点符号字符),其他未定义。
ANSI在这里是一个误称。Microsoft曾经向美国国家标准学会(ANSI)提交了Windows-1252以被采用为标准;提案被拒绝,但Microsoft仍然将其代码称为“ANSI”。更加混乱的是,他们可能会使用“ANSI”来表示不同的编码(基本上是Windows安装的“本地8位编码”)。
在Web环境中,声明ISO-8859-1将被视为声明Windows-1252。原因是C1控件在Web上不被使用或有用,而添加的字符通常被使用,即使在误标记为ISO-8859-1的页面上也是如此。因此,在实际情况下,无论您声明哪个都无关紧要。
仍然可能有一些浏览器实际上将数据解释为ISO-8859-1,如果声明如此,但它们必须非常罕见(我记得最后一次看到是大约十年前的Opera版本)。
您没有描述遇到的问题。问题最常见的原因似乎是数据实际上是UTF-8编码,但被声明为ISO-8859-1(或Windows-1252),反之亦然。如果服务器强制使用无法在其创作环境中处理的字符编码(或不知道如何处理)的Content-Type标题,则这成为Web页面作者的真正问题。

15

这张表格概述了它们之间的区别。它展示了所有在Windows-1252中定义但在ISO-8859-1/ISO-8859-15中不可用的字符:

        │  …0  │  …1  │  …2  │  …3  │  …4  │  …5  │  …6  │  …7  │  …8  │  …9  │  …A  │  …B  │  …C  │  …D  │  …E  │  …F  │
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
     8… │   €  │      │   ‚  │   ƒ  │   „  │   …  │   †  │   ‡  │   ˆ  │   ‰  │   Š  │   ‹  │   Œ  │      │   Ž  │      │
Unicode │ 20AC │      │ 201A │ 0192201E │ 20262020202102C6 │ 2030016020390152 │      │ 017D │      │
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
     9… │      │  ‘   │   ’  │   “  │   ”  │   •  │   –  │   —  │   ˜  │   ™  │   š  │   ›  │   œ  │      │   ž  │   Ÿ  │
Unicode │      │ 20182019201C │ 201D │ 20222013201402DC │ 21220161203A │ 0153 │      │ 017E │ 0178

与Windows-1252不同,ISO-8859-1中使用0x80…0x9F范围来表示控制字符

这张表格展示了Windows-1252、ISO-8859-1和ISO-8859-15之间的区别。

Character    │    € │   Š │   š │   Ž │   ž │   Œ │   œ │   Ÿ │  ¤ │  ¦ │  ¨ │  ´ │  ¸ │  ¼ │  ½ │  ¾ │
───────────────────────────────────────────────────────────────────────────────────────────────────────
ISO 8859-1   │    – │   – │   – │   – │   – │   – │   – │   – │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
ISO 8859-15  │   A4 │  A6 │  A8 │  B4 │  B8 │  BC │  BD │  BE │  – │  – │  – │  – │  – │  – │  – │  – │
Windows-1252808A │  9A │  8E │  9E │  8C │  9C │  9F │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
Unicode      │ 20AC │ 16016117D │ 17E │ 152153178 │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │

2
谢谢,这确实是我想知道的。现在我可以说唯一有意义的区别就是欧元符号 :-) - neves
2
波罗的海地区的人肯定会有不同的看法 :-) - Wernfried Domscheit

5

在使用拉丁字母表的国家,如英国/美国/法国/德国等,ANSI指的是Windows-1252编码。https://web.archive.org/web/20170916200715/http://www.microsoft.com:80/resources/msdn/goglobal/default.mspx

Windows-1252和ISO-8859-1非常相似,只有32个字符不同。

在Windows-1252中,从128到159的字符用于一些有用的字符,例如欧元符号。

在ISO-8859-1中,这些字符被映射为对HTML无用的控制字符。

__ 因此建议检查128是否为欧元符号。如果是,则为Windows 1252。 __

从128到159的代码在ISO-8859-1中未使用,但许多浏览器将显示来自Windows-1252字符集而不是空白的字符。

这两个链接都列出了它们。

http://www.w3schools.com/charsets/ref_html_ansi.asp

http://www.w3schools.com/charsets/ref_html_8859.asp

一些评论非常有用,我根据它们修改了我的帖子。

陈峰指出,在Windows中,“ANSI”指的是由区域设置指定的系统代码页,无论是阿拉伯语/中文/西里尔语/越南语等等。它不一定指的是Windows-1252。您可以通过更改区域设置,然后使用notepad.exe将文本文件保存为“ANSI”来测试此功能。根据这篇微软文档,有14种不同的“ANSI”代码页 https://learn.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers

Wernfriend指出https://web.archive.org/web/20170916200715/http://www.microsoft.com:80/resources/msdn/goglobal/default.mspx,并且美国的代码页437是“OEM代码页”(请参阅OEM列),而OEM代码页是cmd提示符使用的代码页。他还指出/建议,从该网页显示,在许多非英语/拉丁字母的国家中,ansi不是Windows 1252。例如,我注意到希伯来语ansi使用1255(希伯来语OEM代码页为862)。

2
我认为“ANSI也被称为Windows-1252”仅适用于“西方”个人电脑。在其他地区,“ANSI”可能会有所不同,请参阅国家语言支持(NLS)API参考。 - Wernfried Domscheit
@WernfriedDomscheit 嗯...西欧有点西方,而欧洲以外(虽然在政治上从1973年至今是其一部分),但仍然是西方,他们使用的是代码页850,而不是美国的代码页437。我会研究一下所谓的 ANSI 字符集存在不同的字符集这个想法。 - barlop
此外,显然我没有提到ISO 8859-1和Windows-1252之间的重大差异。https://en.wikipedia.org/wiki/Windows-1252 “将Windows-1252文本错误地标记为字符集标签ISO-8859-1非常常见。常见结果是,在非Windows操作系统上,所有引号和撇号(由文字处理软件中的“智能引号”生成)都被替换为问号或方框,使文本难以阅读。” - barlop
1
您错过了“ANSI代码页”和“OEM代码页”列。对于大多数国家/地区,ANSI代码页是1252,但也有一些其他的代码页。“OEM”是在启动cme.exe时的默认代码页。 - Wernfried Domscheit
2
在Windows上,“ANSI”是指由语言环境指定的系统代码页,无论是阿拉伯语/中文/西里尔字母/越南语等。它不是指Windows-1252。您可以通过更改语言环境,然后使用notepad.exe将文本文件保存为“ANSI”来测试此功能。根据此MS文档,有14种不同的“ANSI”代码页。 - Chenfeng

2

Windows-1252和ISO-8859-1之间的确切区别是什么?

- 比较Windows-1252(CP-1252)ISO-8859-1的字符集。
如果您检查这些图表,您会注意到Windows-1252有27个字符在ISO-8859-1中未定义没有其他区别。 (您可能需要单击图像以放大它。)

ISO-8859-1 and Windows-1252 (CP-1252) compared

^ 点击放大

这里有同样的信息,只需要一个图表就可以了。

Windows-1252, the difference to ISO-8859-1 in red.

其他问题的答案

Windows-1252(1/3/4)和ISO-8859-1有什么区别?

- 我已经解释了Windows-1252和ISO-8859-1之间的区别。
例如,Windows-1251与Windows-1252的区别在于Windows-1251具有使用西里尔字母表的字符,而这些字符在Windows-1252中完全不存在。 同样,Windows-1253包括希腊字母表,Windows-1254包括土耳其字母表。 对于其他语言-所有十个Windows代码页,请参见我在this answer末尾包含的表格。

ANSI在这里起到了什么作用?

微软将 ANSI 作为其十种Windows代码页的总称。Microsoft在所有版本的Windows中都使用这种约定,在文本编辑器notepad.exe中,通常位于C:\WINDOWS\System32
其他文本编辑器,如Notepad2Notepad++ 也采用了这种约定。

我们的Debian服务器应该使用什么编码?

– 您应该绝对使用UTF-8。 例如,请参阅字符编码 | MDN

参考资料


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