Unicode,UTF,ASCII,ANSI格式差异


351

是什么之间的区别UnicodeUTF8UTF7UTF16UTF32ASCII,和ANSI编码?

这些对程序员有什么帮助?



6
非常相关:UTF-8与Unicode
Tobias Kienzler


Answers:


470

在您的清单中:

  • Unicode ”不是一种编码,尽管不幸的是,许多文档不准确地使用它来指代特定系统默认使用的Unicode编码。在Windows和Java上,这通常意味着UTF-16。在许多其他地方,它表示UTF-8。正确地,Unicode是指抽象字符集本身,而不是任何特定的编码。
  • UTF-16:每个“代码单元” 2个字节。这是.NET(通常是Windows和Java)中字符串的本机格式。基本多语言平面(BMP)之外的值被编码为代理对。这些曾经相对很少使用,但是现在许多消费者应用程序将需要意识到非BMP字符才能支持表情符号。
  • UTF-8:可变长度编码,每个代码点1-4个字节。ASCII值使用1个字节编码为ASCII。
  • UTF-7:通常用于邮件编码。如果您认为自己需要它而没有发送邮件,则可能是错误的。(这只是我在新闻组等中发布消息的人的经历-外部邮件,实际上根本没有被广泛使用。)
  • UTF-32:固定宽度编码,每个代码点使用4个字节。这不是很有效,但是可以使BMP之外的生活更加轻松。如果您愿意Utf32String,我的MiscUtil库中有一个.NET 类。(请注意,尚未经过全面测试。)
  • ASCII:仅使用后7位进行单字节编码。(Unicode代码指向0-127。)无重音等。
  • ANSI:没有一种固定的ANSI编码-其中有很多。通常,当人们说“ ANSI”时,它们的意思是“我系统的默认语言环境/代码页”,它是通过Encoding.Default获得的,通常是Windows-1252,但可以是其他语言环境。

我的Unicode页面上还有更多内容,以及调试Unicode问题的提示

另一个重要的代码资源是unicode.org,它包含的信息比您以往所能掌握的更多-可能最有用的是代码图


6
当将术语“ ANSI”应用于Microsoft的8位代码页时,使用的是错误的称呼。它们基于为ANSI标准化而提交的草案,但是ANSI本身从未对其进行标准化。Windows-1252(最常称为“ ANSI”的代码页)与ISO 8859-1(Latin-1)相似,不同之处在于Windows-1252的可打印字符范围为0x80..0x9F,其中ISO 8859-1具有该范围内的控制字符。Unicode在该范围内也具有控制字符。zh.wikipedia.org/wiki/Windows_code_page
Keith Thompson

1
@ jp2code:我不会-但是您需要区分“从Web服务器通过HTTP发送回的内容”和“通过电子邮件发送的内容”。发送电子邮件的不是网页内容,而是电子邮件背后的应用程序。Web内容最好是UTF-8。邮件内容可能是UTF-7,尽管我怀疑现在将其保留在UTF-8中是可以的。
乔恩·斯基特

2
对于UTF-16,恕我直言,我会说“每个代码单元2个字节”,因为BMP外部的代码点将以代理对的形式编码为2个代码单元(4个字节)。
Ludovic Kuty 2015年

1
缺少UTF-16LE(在.NET中)和BE之间的区别以及BOM表的概念。
Maarten Bodewes '16

2
@Andrew:不,没有(一般)编码标记。Windows 1252不能表示Unicode BOM,也没有任何意义,因为它只是每字符一个字节的编码。
乔恩·斯基特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.