什么是Unicode,UTF-8,UTF-16?

时间:2010-02-11 00:12:58

标签: unicode encoding utf-8 utf-16

Unicode的基础是什么以及为什么需要UTF-8或UTF-16? 我在Google上研究了这个并在这里搜索过,但我不清楚。

在进行文件比较时,在VSS中,有时会显示一条消息,指出这两个文件具有不同的UTF。为什么会这样呢?

请用简单的语言解释。

8 个答案:

答案 0 :(得分:57)

  • 的Unicode
    • 是世界各地使用的一组字符
  • UTF-8
    • 一种能够以Unicode编码所有可能字符(称为代码点)的字符编码。
    • 代码单位是8位
    • 使用一到四个代码单元来编码Unicode
    • 00100100 表示“ $ ”(一个8位); 11000010 10100010 表示“¢”(两个8位); 11100010 10000010 10101100 用于“”(三个8位)
  • UTF-16
    • 另一个字符编码
    • 代码单位是16位
    • 使用一到两个代码单元来编码Unicode
    • 00000000 00100100 表示“ $ ”(一个16位); 11011000 01010010 11011111 01100010 表示“ “(两个16位)

答案 1 :(得分:26)

  

Unicode是一个相当复杂的标准。不要太害怕,但是   准备一些工作! [2]

因为总是需要可靠的资源,但官方报告很大,我建议阅读以下内容:

  1. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) Stack Exchange首席执行官Joel Spolsky的介绍。
  2. To the BMP and beyond!后来,在Unicode联盟的副总裁,技术总监Eric Muller的教程。 (前20张幻灯片,你完成了)
  3. 简要说明:

    计算机读取字节,人们读取字符,因此我们使用编码标准将字符映射到字节。 ASCII是第一个广泛使用的标准,但仅涵盖拉丁语(7位/字符可代表128个不同的字符)。 Unicode是一个标准,其目标是覆盖世界上所有可能的字符(最多可容纳1,114,112个字符,意味着最多21位/字符。当前Unicode 8.0总共指定120,737个字符,这就是全部)。

    主要区别在于ASCII字符可以适合一个字节(8位),但大多数Unicode字符不能。因此使用编码表单/方案(如UTF-8和UTF-16),字符模型如下:

    每个字符都有一个从0到1,114,111(十六进制:0-10FFFF)的枚举位置,称为代码点
    编码表单将代码点映射到代码单元序列。 代码单元是您希望在内存,8位单元,16位单元等中组织字符的方式。 UTF-8使用1到4个8位单元,UTF-16使用1或2个16位单元,以覆盖最大21位的整个Unicode。单位使用前缀,以便可以发现字符边界,更多单位意味着占用比特的前缀更多。因此,尽管UTF-8使用1个字节用于拉丁文脚本,但它需要3个字节用于基本多语言平面内的后续脚本,而UTF-16使用2个字节用于所有这些。这是他们的主要区别。
    最后,编码方案(如UTF-16BE或UTF-16LE)将代码单元序列映射(序列化)为字节序列。

    字符:π
    代码点:U + 03C0
    编码形式(代码单位):
    UTF-8:CF 80
    UTF-16:03C0
    编码方案(字节):
    UTF-8:CF 80
    UTF-16BE:03 C0
    UTF-16LE:C0 03

    提示:十六进制数字代表4位,因此两位十六进制数字代表一个字节
    另请查看维基百科中的平面地图,以了解字符集布局

答案 2 :(得分:18)

最初,Unicode旨在使用固定宽度的16位编码(UCS-2)。 Unicode的早期采用者,如Java和Windows NT,围绕16位字符串构建了它们的库。

后来,Unicode的范围扩展到包括历史字符,这需要16位编码支持的超过65,536个代码点。为了允许在使用UCS-2的平台上表示其他字符,引入了UTF-16编码。它使用“代理对”来表示补充平面中的字符。

与此同时,许多较旧的软件和网络协议都在使用8位字符串。 UTF-8的制作使得这些系统可以支持Unicode而无需使用宽字符。它向后兼容7位ASCII。

答案 3 :(得分:11)

本文解释了所有细节 http://kunststube.net/encoding/

写作缓冲

如果您使用UTF8编码写入4字节缓冲区,符号,您的二进制文件将如下所示:

00000000 11100011 10000001 10000010

如果您使用UTF16编码写入4字节缓冲区,符号,您的二进制文件将如下所示:

00000000 00000000 00110000 01000010

正如您所看到的,根据您在内容中使用的语言,这将相应地影响您的记忆。

e.g。对于此特定符号: UTF16编码效率更高,因为我们有2个备用字节用于下一个符号。但这并不意味着您必须将UTF16用于日本字母表。

从缓冲区读取

现在,如果你想读取上面的字节,你必须知道它被写入的编码并正确解码。

e.g。如果你解码这个:   00000000 11100011 10000001 10000010 进入UTF16编码后,最终会得到而不是

注意:编码和Unicode是两回事。 Unicode是大(table),每个符号映射到唯一的代码点。例如符号(字母)有一个(code point) 30 42 (十六进制)。另一方面,编码是一种算法,当存储到硬件时,它将符号转换为更合适的方式。

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

enter image description here

答案 4 :(得分:9)

为什么要unicode?因为ASCII只有127个字符。那些128到255的国家在不同国家有所不同,这就是为什么有代码页。所以他们说让我们有1114111个字符。那么如何存储最高代码点?您需要使用21位存储它,因此您将使用具有32位且浪费了11位的DWORD。因此,如果使用DWORD存储unicode字符,则这是最简单的方法,因为DWORD中的值与代码点完全匹配。但是DWORD数组当然比WORD数组大,当然甚至比BYTE数组更大。这就是为什么不仅有utf-32,还有utf-16。但utf-16表示WORD流,而WORD有16位,那么最高代码点1114111如何适合WORD?这不可以!因此他们将高于65535的东西放入一个他们称为代理对的DWORD中。这样的代理对是两个单词,可以通过查看前6位来检测。那么utf-8怎么样?它是一个字节数组或字节流,但最高代码点1114111如何适合一个字节?这不可以!好吧,所以他们也装了DWORD吧?或者可能是一个词,对吗?几乎是对的!他们发明了utf-8序列,这意味着每个高于127的代码点必须编码为2字节,3字节或4字节序列。哇!但是我们怎样才能发现这样的序列?好吧,高达127的一切都是ASCII,是一个字节。以110开头的是一个双字节序列,以1110开头的是一个三字节序列,以11110开头的是一个四字节序列。这些所谓的“startbytes”的剩余部分属于代码点。现在,根据顺序,必须遵循以下字节。后续字节以10开头,其余位为6位有效负载位并属于代码点。连接startbyte和后续字节的有效负载位,你将获得代码点。这就是utf-8的神奇之处。

答案 5 :(得分:8)

Unicode 是将所有语言中的字符映射到名为代码点的特定数值的标准。这样做的原因是它允许使用相同的代码点集进行不同的编码。

UTF-8和UTF-16是两种这样的编码。它们将代码点作为输入,并使用一些明确定义的公式对它们进行编码,以生成编码字符串。

选择特定编码取决于您的要求。不同的编码具有不同的内存要求,并且根据您将要处理的字符,您应该选择使用最少字节序列对这些字符进行编码的编码。

有关Unicode,UTF-8和UTF-16的更深入细节,您可以查看这篇文章,

What every programmer should know about Unicode

答案 6 :(得分:4)

ASCII-软件为给定字符仅在内存中分配8位字节。它对于英语和采用(外立面之类的外来字)字符的效果很好,因为它们对应的十进制值在十进制值以下。示例C程序。

UTF-8-软件为给定字符分配1到4个可变8位字节。这里的变量是什么意思?假设您正在通过浏览器中的HTML页面发送字符“ A”(HTML为UTF-8),则A的对应十进制值为65,将其转换为十进制时它将变为01000010。这仅需要1个字节,甚至会为façade中的“ç”等特殊采用的英语字符分配1个字节的内存。但是,当您要存储欧洲字符时,它需要2个字节,因此您需要UTF-8。但是,当您使用亚洲字符时,需要最少2个字节,最多4个字节。同样,表情符号需要3到4个字节。 UTF-8将满足您的所有需求。

UTF-16将为每个字符分配最少2个字节,最多分配4个字节,而不分配1个或3个字节。每个字符都以16位或32位表示。

那为什么存在UTF-16?最初,Unicode是16位而不是8位。 Java采用了UTF-16的原始版本。

简而言之,除非您正在使用的语言或平台已经采用了UTF-16,否则您在任何地方都不需要UTF-16。

网络浏览器调用的Java程序使用UTF-16,但网络浏览器使用UTF-8发送字符。

答案 7 :(得分:2)

UTF代表Unicode转换格式的代表。基本上在今天的世界中,有数百种其他语言编写的脚本,这些格式不在前面使用的基本ASCII中。因此,UTF成立了。

UTF-8具有字符编码功能,其代码单元为8位,而UTF-16则为16位。