Unicode的基础是什么以及为什么需要UTF-8或UTF-16? 我在Google上研究了这个并在这里搜索过,但我不清楚。
在进行文件比较时,在VSS中,有时会显示一条消息,指出这两个文件具有不同的UTF。为什么会这样呢?
请用简单的语言解释。
答案 0 :(得分:57)
答案 1 :(得分:26)
Unicode是一个相当复杂的标准。不要太害怕,但是 准备一些工作! [2]
因为总是需要可靠的资源,但官方报告很大,我建议阅读以下内容:
简要说明:
计算机读取字节,人们读取字符,因此我们使用编码标准将字符映射到字节。 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.
答案 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的更深入细节,您可以查看这篇文章,
答案 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位。