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

什么是Unicode、UTF-8、UTF-16?,unicode,encoding,utf-8,utf-16,Unicode,Encoding,Utf 8,Utf 16,Unicode的基础是什么?为什么需要UTF-8或UTF-16? 我在谷歌上对此进行了研究,并在这里进行了搜索,但我并不清楚 在VSS中,在进行文件比较时,有时会显示一条消息,说明这两个文件具有不同的UTF。为什么会这样 请简单解释。最初,Unicode旨在采用固定宽度的16位编码(UCS-2)。Unicode的早期采用者,如Java和Windows NT,围绕16位字符串构建其库 后来,Unicode的范围扩大到包括历史字符,这将需要超过16位编码所支持的65536个代码点。为了允许在使用UC

Unicode的基础是什么?为什么需要UTF-8或UTF-16? 我在谷歌上对此进行了研究,并在这里进行了搜索,但我并不清楚

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


请简单解释。

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

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

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

为什么我们需要Unicode? 在(不太)早期,所有存在的都是ASCII码。这没关系,因为所需要的只是一些控制字符、标点符号、数字和字母,就像这句话中的那些。不幸的是,今天的全球交流和社交媒体的奇怪世界并没有被预见到,看到英语也不是很少见,汉语, עִבְרִית,ελληνικά,以及ភាសាខ្មែរ 在同一个文档中(我希望我没有破坏任何旧浏览器)

但为了论证起见,让我们假设Joe Average是一名软件开发人员。他坚持只需要英语,因此只想使用ASCII码。这对于用户Joe来说可能是好的,但是对于软件开发人员Joe来说却不是好的。世界上大约有一半的人使用非拉丁字符,而使用ASCII对这些人来说无疑是不体谅人的。除此之外,他正在将自己的软件与一个庞大且不断增长的经济体隔绝

因此,需要一个包含所有语言的字符集。Unicode就这样诞生了。它为每个字符分配一个称为代码点的唯一数字。与其他可能的集合相比,Unicode的一个优点是前256个代码点与相同,因此也是ASCII。此外,绝大多数常用字符仅可由两个字节表示,该区域称为。现在需要一个字符编码来访问这个字符集,正如问题所问,我将集中讨论UTF-8和UTF-16

内存注意事项 那么有多少字节可以访问这些编码中的哪些字符呢

  • UTF-8:
    • 1字节:标准ASCII码
    • 2字节:阿拉伯文、希伯来文、大多数欧洲文字(最显著的除外)
    • 3字节:BMP
    • 4字节:所有Unicode字符
  • UTF-16:
    • 2字节:BMP
    • 4字节:所有Unicode字符
现在值得一提的是,BMP中没有的字符包括古代脚本、数学符号、音乐符号和稀有字符

如果您主要使用ASCII字符,那么UTF-8肯定会更节省内存。但是,如果您主要使用非欧洲脚本,那么使用UTF-8的内存效率可能比UTF-16低1.5倍。在处理大量文本(如大型网页或冗长的word文档)时,这可能会影响性能

编码基础 注意:如果您知道UTF-8和UTF-16是如何编码的,请跳到下一节了解实际应用

  • UTF-8:对于标准ASCII(0-127)字符,UTF-8代码是相同的。如果需要与现有ASCII文本向后兼容,这使得UTF-8非常理想。其他字符需要2-4字节。这是通过在每个字节中保留一些位来完成的,以指示它是多字节字符的一部分。特别是,每个字节的第一位是
    1
    ,以避免与ASCII字符冲突
  • UTF-16:对于有效的BMP字符,UTF-16表示形式只是其代码点。但是,对于非BMP字符,UTF-16引入了代理项对。在这种情况下,两个双字节部分的组合映射到非BMP字符。这两个字节部分来自BMP数字范围,但Unicode标准保证作为BMP字符无效。此外,由于UTF-16有两个字节作为其基本单位,因此它受到以下因素的影响。为了进行补偿,可以在数据流的开头放置一个保留的字节顺序标记,该标记表示结束。因此,如果您正在读取UTF-16输入,并且未指定endianness,则必须对此进行检查
可以看出,UTF-8和UTF-16彼此之间并不兼容。因此,如果您正在进行I/O,请确保您知道使用的是哪种编码!有关这些编码的更多详细信息,请参阅

实用编程注意事项 字符和字符串数据类型:它们在编程语言中是如何编码的?如果它们是原始字节,那么在您尝试输出非ASCII字符时,可能会遇到一些问题。此外,即使字符类型基于UTF,也不意味着字符串是正确的UTF。它们可能允许非法的字节序列。通常,您必须使用支持UTF的库,例如C、C++和java。在任何情况下,如果您想要输入/输出除默认编码以外的内容,则必须首先对其进行转换

推荐/默认/主导编码:在选择使用哪种UTF时,通常最好遵循您所处环境的推荐标准。例如,UTF
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.