什么是Unicode、UTF-8和UTF-16? [英] What are Unicode, UTF-8, and UTF-16?
问题描述
在VSS中,进行文件比较时,有时会出现两个文件的UTF不同的消息,为什么会这样?
请简单解释。
unicode
为什么需要推荐答案?
在早期(不是太早),所有存在的都是ASCII。这很好,因为所需要的只是几个控制字符、标点符号、数字和字母,就像这句话中的那些。不幸的是,没有预见到今天全球相互交流和社交媒体的奇特世界,在同一文档中看到英语、العربية,汉语,עִבְרִית,ελληνικά和ភាសាខ្មែរ并不是太罕见(我希望我没有破坏任何旧浏览器)。
为了便于讨论,我们假设Joe Average是一名软件开发人员。他坚持认为他永远只需要英语,因此只想使用ASCII。这对于用户Joe来说可能很好,但是对于软件开发人员Joe来说就不太好了。世界上大约一半的人使用非拉丁字符,使用ASCII可以说是对这些人的不体谅,最重要的是,他正在向一个巨大的、不断增长的经济体关闭他的软件。
因此,需要包含所有语言的包含字符集。于是,Unicode应运而生。它为每个字符分配一个唯一的数字,称为代码点。与其他可能的集合相比,Unicode的一个优点是前256个代码点与ISO-8859-1相同,因此也与ASCII相同。此外,在称为Basic Multilingual Plane (BMP)的区域中,绝大多数常用字符只能由两个字节表示。现在需要使用字符编码来访问此字符集,正如问题所问的那样,我将重点介绍UTF-8和UTF-16。
内存注意事项
那么有多少字节可以访问这些编码中的哪些字符?
- UTF-8:
- 1字节:标准ASCII
- 2字节:阿拉伯语、希伯来语、大多数欧洲文字(最明显的是不包括Georgian)
- 3字节:bmp
- 4字节:所有Unicode字符
- UTF-16:
- 2字节:bmp
- 4字节:所有Unicode字符
现在值得一提的是,不在BMP中的字符包括古代文字、数学符号、音乐符号和较罕见的Chinese/Japanese/Korean (CJK)字符。
如果您主要使用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以两个字节为基本单位,因此受到endianness的影响。为了补偿,可以将保留的字节顺序标记放在数据流的开头,以指示字符顺序。因此,如果您正在读取UTF-16输入,并且未指定字符顺序,则必须检查此情况。
实际编程注意事项
字符和字符串数据类型:它们在编程语言中是如何编码的?如果它们是原始字节,则在尝试输出非ASCII字符的那一刻,可能会遇到一些问题。此外,即使字符类型基于UTF,也不意味着字符串是正确的UTF。它们可能允许非法的字节序列。通常,您必须使用支持UTF的库,例如用于C、C++和Java的ICU。在任何情况下,如果要输入/输出默认编码以外的内容,都必须先进行转换。
推荐/默认/主导编码:在选择使用哪种UTF时,通常最好遵循您所在环境的推荐标准。例如,UTF-8在Web上占主导地位,自HTML5以来,它一直是recommended encoding。相反,.NET和Java环境都基于UTF-16字符类型。令人困惑(且不正确)的是,经常引用"Unicode编码",它通常指的是给定环境中占主导地位的UTF编码。
库支持:您正在使用的库支持某种编码。哪个?他们支持角落里的案子吗?由于需要是发明之母,UTF-8库通常会正确地支持4字节字符,因为1、2甚至3字节的字符可能经常出现。但是,并非所有声称的UTF-16库都正确支持代理项对,因为它们很少出现。
统计字符:Unicode中存在组合字符。例如,代码点U+006E(N)和U+0303(组合波浪号)形成ñ;,但是代码点U+00F1形成ñ;。它们看起来应该是一样的,但是简单的计数算法将为第一个示例返回2,为后一个示例返回1。这不一定是错误的,但也可能不是预期的结果。
相等比较:A;、А;和Α;看起来相同,但它们分别是拉丁文、西里尔文和希腊文。您还有像C;和Ⅽ;这样的案例,一个是字母,另一个是罗马数字。此外,我们还需要考虑组合特征。有关详细信息,请参阅Duplicate characters in Unicode。
代理对:这些在SO上经常出现,所以我只提供一些示例链接:
其他?:
这篇关于什么是Unicode、UTF-8和UTF-16?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!