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

在VSS中,当进行文件比较时,有时会有一个消息说两个文件有不同的UTF。为什么会这样呢?

请简单解释一下。


当前回答

文章什么每个程序员绝对,积极地需要知道编码和字符集来处理文本解释了所有的细节。

写入缓冲区

如果你写入一个4字节的缓冲区,符号あUTF8编码,你的二进制将看起来像这样:

00000000 11100011 10000001 10000010

如果你写入一个4字节的缓冲区,使用UTF16编码的符号あ,你的二进制将看起来像这样:

00000000 00000000 00110000 01000010

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

示例:对于这个特定的符号:あUTF16编码更有效,因为我们有2个空闲字节用于下一个符号。但这并不意味着你必须使用UTF16来表示日本字母。

从缓冲区读取

现在,如果你想读取上面的字节,你必须知道它是用什么编码写的,并正确解码回来。

例:如果你解码这个: 00000000 11100011 10000001 10000010 转换为UTF16编码,你将得到臣而不是あ

注意:Encoding和Unicode是两个不同的东西。Unicode是一个大(表),每个符号都映射到一个唯一的码点。例如,あ符号(字母)有一个(码位):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.

其他回答

为什么Unicode ?因为ASCII只有127个字符。128到255在不同的国家是不同的,这就是为什么会有代码页。所以他们说:让我们有1114111个字符。

那么如何存储最高码位呢?您需要使用21位存储它,因此您将使用一个32位的DWORD,浪费了11位。因此,如果使用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开头的是一个四字节序列。这些所谓的“开始字节”的剩余位属于代码点。

现在,根据序列的不同,后面的字节必须跟着。后面的字节以10开头,其余位为有效负载位的6位,属于码位。将开始字节的有效负载位和后面的字节/秒连接起来,就得到了代码点。这就是UTF-8的魔力所在。

文章什么每个程序员绝对,积极地需要知道编码和字符集来处理文本解释了所有的细节。

写入缓冲区

如果你写入一个4字节的缓冲区,符号あUTF8编码,你的二进制将看起来像这样:

00000000 11100011 10000001 10000010

如果你写入一个4字节的缓冲区,使用UTF16编码的符号あ,你的二进制将看起来像这样:

00000000 00000000 00110000 01000010

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

示例:对于这个特定的符号:あUTF16编码更有效,因为我们有2个空闲字节用于下一个符号。但这并不意味着你必须使用UTF16来表示日本字母。

从缓冲区读取

现在,如果你想读取上面的字节,你必须知道它是用什么编码写的,并正确解码回来。

例:如果你解码这个: 00000000 11100011 10000001 10000010 转换为UTF16编码,你将得到臣而不是あ

注意:Encoding和Unicode是两个不同的东西。Unicode是一个大(表),每个符号都映射到一个唯一的码点。例如,あ符号(字母)有一个(码位):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.

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

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

每个软件开发人员必须绝对、肯定地了解Unicode和字符集(没有借口!)Stack Exchange首席执行官Joel Spolsky的介绍。 为BMP和超越!Unicode联盟的技术总监,后来的副总裁Eric Muller的教程(前20张幻灯片就完成了)

简要说明:

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

主要的区别是ASCII字符可以容纳一个字节(8位),但大多数Unicode字符不能。所以使用编码形式/方案(如UTF-8和UTF-16),字符模型是这样的:

Every character holds an enumerated position from 0 to 1,114,111 (hex: 0-10FFFF) called a code point. An encoding form maps a code point to a code unit sequence. A code unit is the way you want characters to be organized in memory, 8-bit units, 16-bit units and so on. UTF-8 uses one to four units of eight bits, and UTF-16 uses one or two units of 16 bits, to cover the entire Unicode of 21 bits maximum. Units use prefixes so that character boundaries can be spotted, and more units mean more prefixes that occupy bits. So, although UTF-8 uses one byte for the Latin script, it needs three bytes for later scripts inside a Basic Multilingual Plane, while UTF-16 uses two bytes for all these. And that's their main difference. Lastly, an encoding scheme (like UTF-16BE or UTF-16LE) maps (serializes) a code unit sequence to a byte sequence.

性格:π 代码点:U+03C0 编码形式(编码单位): utf-8: cf 80 utf - 16: 03 c0 编码方案(字节): utf-8: cf 80 utf-16be: 03 c0 utf-16le: c0 03

提示:十六进制数字代表四位,所以两位十六进制数字代表一个字节。 也可以看看维基百科上的平面地图,了解一下字符集布局。

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

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

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

有关Unicode, UTF-8和UTF-16的更多详细信息,您可以查看这篇文章,

关于Unicode,每个程序员都应该知道的

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

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

与此同时,许多旧的软件和网络协议使用8位字符串。UTF-8是为了让这些系统可以支持Unicode而不必使用宽字符。它向后兼容7位ASCII。