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

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

请简单解释一下。


当前回答

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

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

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

其他回答

ASCII -软件仅为给定字符在内存中分配8位字节。它适用于英语,并采用(外来词façade)字符,因为它们对应的十进制值小于128。示例C程序。

UTF-8 - Software allocates one to four variable 8-bit bytes for a given character. What is meant by a variable here? Let us say you are sending the character 'A' through your HTML pages in the browser (HTML is UTF-8), the corresponding decimal value of A is 65, when you convert it into decimal it becomes 01000010. This requires only one byte, and one byte memory is allocated even for special adopted English characters like 'ç' in the word façade. However, when you want to store European characters, it requires two bytes, so you need UTF-8. However, when you go for Asian characters, you require minimum of two bytes and maximum of four bytes. Similarly, emojis require three to four bytes. UTF-8 will solve all your needs.

UTF-16将为每个字符分配最少2字节和最多4字节,它不会分配1或3字节。每个字符用16位或32位表示。

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

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

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

UTF代表Unicode转换格式。基本上,在当今世界,有数百种其他语言编写的脚本,这些脚本的格式不包括在以前使用的基本ASCII中。因此,UTF应运而生。

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

为什么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的魔力所在。

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

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

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

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

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