Unicode的新手指南

11

请问有没有人能简明地为我定义以下术语:

  • Unicode
  • UTF7
  • UTF8
  • UTF16
  • UTF32
  • 编码页(Codepages)
  • 它们与Ascii/Ansi/Windows 1252的不同之处

我不需要维基百科链接或太详细的内容,只需要简要介绍Unicode的巨大变化是如何发生的,以及为什么作为程序员你应该关心这些。

7个回答

19

3
唯一的注意事项是,部分信息已经过时(unicode 标准一直在更新),不过对于提问者感兴趣的话题来说,并不需要太在意这些过时的信息。 - Kathy Van Stone
2
实际上,Joe经常提到的文章即使在它发表的时候(2003年)也是不正确的。正确的UTF-8编码只有4个字节(而不是6个),还有一种叫做“纯文本”的东西(与编码无关),UCS不是Unicode术语(而是ISO术语),wchar_t和L"Hello"并不一定是Unicode。但是嘿,他比其他人知道得多,即使其中一些是错误的。 这条信息仍然是正确的 :-) - Mihai Nita
@Mihai:①UTF-8可以达到每个字符6个字节,但目前只需要4个。Joel的表格非常清楚。②什么是“纯文本”?纯ASCII文本吗?③对UCS和lingo源没有异议④(挑剔一下:) wchar_tL"Hello"始终是Unicode,显然是编码的。当然,即使"Mihai Nita"也是Unicode,编码为ASCIIISO8859-1CP1252甚至CP1253等。 - tzot
@tzot说:“wchar_t和L”Hello“始终是Unicode”:根据C/C++标准并非如此。“wchar_t的宽度是与编译器相关的,可以小至8位。因此,需要在任何C或C++编译器之间进行移植的程序不应使用wchar_t来存储Unicode文本。wchar_t类型旨在存储编译器定义的宽字符,这些字符在某些编译器中可能是Unicode字符。” http://en.wikipedia.org/wiki/Wide_character#C.2FC.2B.2B - Mihai Nita
1
http://www.utf8everywhere.org 是 Joel 文章的绝佳续集,讲述了你在应用程序中真正应该做什么。 - Pavel Radzivilovsky
显示剩余3条评论

13
如果你想进行真正简短的介绍: 5分钟了解Unicode 或者如果你只想要一句话:
  • Unicode:字符到整数(“码点”)的映射,范围在0到1,114,111之间;涵盖了几乎所有正在使用的书写语言
  • UTF7:将码点编码为字节流,高位清除;一般不要使用
  • UTF8:将码点编码为字节流,其中每个字符可以使用一、二、三或四个字节表示;应该是您首选的编码方式
  • UTF16:将码点编码为单词流(16位单位),其中每个字符可能需要一个或两个单词(两个或四个字节)来表示
  • UTF32:将码点编码为32位单元的流,其中每个字符占用精确一个单元(四个字节);有时用于内部表示
  • 代码页:DOS和Windows中的一种系统,将字符分配给整数,并分配相关的编码方式;每个代码页只覆盖其中的一部分语言。请注意,这些分配通常与Unicode分配不同
  • ASCII:一种非常常见的将字符分配给整数的方式,以及直接将其编码为字节(所有高位清除);该分配是Unicode的子集,而编码是UTF-8的子集
  • ANSI:一个标准机构
  • Windows 1252:一种常用的代码页;类似于ISO-8859-1或Latin-1,但并不完全相同,两者经常混淆
为什么您要关心它?因为如果您不知道正在使用的字符集和编码方式,您实际上不知道给定字节流表示哪些字符。例如,字节0xDE可以编码为:
  • Þ(拉丁大写字母Thorn)
  • fi(拉丁小型连字 FI)
  • ή(带音调的希腊小写字母 eta)
  • 或其他13个字符,具体取决于所使用的编码和字符集。

  • 6

    除了经常被引用的Joel文章外,我还有自己的一篇文章,从.NET的角度来看待这个问题,以增加多样性...(点击此处查看)


    3

    是的,我有一些见解,但可能是错误的,不过它帮助我理解了它。

    让我们来看一些文本。它以一系列字节的形式存储在计算机的随机存取存储器中,代码页只是字节和你我读到的字符之间的映射表。因此,像记事本这样的应用程序随附其代码页,并将字节转换为屏幕上的内容,你会看到一堆垃圾、倒置的问号等等。这并不意味着你的数据已经损坏,只是读取字节的应用程序没有使用正确的代码页。一些应用程序比其他应用程序更聪明地检测要使用的正确代码页,而且内存中的一些字节流包含一个 BOM(字节顺序标记),它可以声明要使用的正确代码页。

    UTF7、8、16 等都只是使用不同格式的不同代码页。

    使用不同代码页存储的相同文件将具有不同的文件大小,因为字节存储方式不同。

    它们与 Windows 1252 实际上并没有太大区别,因为那只是另一个代码页。

    要获得更好、更智能的答案,请尝试其中一个链接。



    2
    其他人已经指出了足够好的参考资料。我不是列出一个真正的“Dummy's guide”,而是从Unicode联盟页面中提供一些指针。您将在Unicode联盟页面上找到更多使用不同编码的细节原因。 Unicode FAQ是回答您一些(但不是全部)问题的好地方。
    更简洁的关于Unicode存在的原因的答案,可以在Unicode网站的新手入门部分中找到:
    Unicode为每个字符提供独特的编号,无论平台、程序或语言如何。
    至于使用UTF-8、UTF-16或UTF-32的技术原因,答案在Unicode技术介绍中。
    UTF-8是HTML和类似协议中常用的编码方式。UTF-8是一种将所有Unicode字符转换为可变长度字节编码的方式。它的优势在于与熟知的ASCII集对应的Unicode字符具有与ASCII相同的字节值,并且将Unicode字符转换为UTF-8后,可以在很多现有软件中使用而无需进行大量的软件重写。
    UTF-16在许多需要平衡对字符的高效访问和经济使用存储空间的环境中很受欢迎。它相当紧凑,所有经常使用的字符都适合于单个16位代码单元,而所有其他字符可以通过一对16位代码单元访问。
    UTF-32在内存空间不受限制,但希望以固定宽度、单个代码单元访问字符的情况下很受欢迎。使用UTF-32时,每个Unicode字符都被编码在单个32位代码单元中。
    这三种编码形式中,每个字符最多需要4个字节(或32位)的数据。
    一般的规则是,当你的应用程序主要支持的语言位于印度河以西时,使用UTF-8,而当它们位于印度河以东时则使用UTF-16。如果你关心字符的统一存储,那么使用UTF-32。
    顺便说一下,UTF-7不是Unicode标准,主要是为邮件应用程序设计的。

    1
    请注意,如果您的应用程序中存储了标记(HTML、XML或其他类似的标记),那么即使是亚洲语言,使用UTF-8通常也更有效率。例如,在处理网络时,选择在整个工作流程中统一使用UTF-8是完全合理的。 - MtnViewMark
    是的,我同意在处理网络时使用这种观点。然而,对于使用C/C++等语言编写的厚客户端来说,在亚洲语言市场中使用UTF-16通常是有道理的。 - Vineet Reynolds

    0
    我不是在寻找维基百科链接或详细信息,只是想了解一些有关Unicode巨大变化的简要信息,以及作为程序员为什么应该关心它们。
    首先,不存在“Unicode的变化”。Unicode是一个标准,是将代码点(整数)分配给字符的标准。UTF8是表示这些整数为字节的最流行方式!
    作为程序员,为什么应该关心呢?
    - 了解这个很有趣! - 如果您没有编码的基本理解,很容易产生错误的代码。
    例子:你从某个地方收到一个ByteArray myByteArray,并且你知道它代表字符。然后你运行myByteArray.toString(),你得到字符串Hello。你的程序工作了!有一天,在发布代码后,你的德国客户打来电话说:“我们有一个问题,äöü没有正确显示!”你开始调试代码,感觉非常迷茫,因为你没有基本的编码理解。但是,通过对编码的理解,你知道错误可能是这样的:当运行myByteArray.toString()时,你的程序假定该字符串是使用默认系统编码进行编码的。但也许不是这样!也许它是UTF8编码,而你的系统是LATIN-SOMETHING,所以你应该运行myByteArray.toString("UTF8")

    资源:

    我不建议像其他人建议的那样阅读Joel的文章。它是一篇很长的文章,包含很多无关紧要的信息。我几年前读过它,但它的实质并没有留在我的脑海中,因为有太多不重要的细节。

    如前所述,http://wiki.secondlife.com/wiki/Unicode_In_5_Minutes 是了解 Unicode 本质的好去处。

    如果您想真正理解像 UTF8 这样的可变长度编码,我建议阅读 https://www.tsmean.com/articles/encoding/unicode-and-utf-8-tutorial-for-dummies/


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