如果UTF-8是8位编码,为什么它需要1-4个字节?

问题描述

| 在Unicode网站上写道,UTF-8可以用1-4个字节表示。据我从这个问题可以理解,https://softwareengineering.stackexchange.com/questions/77758/why-are-there-multiple-unicode-encodings UTF-8是一种8位编码。 那么,真相是什么? 如果是8位编码,那么ASCII和UTF-8有什么区别? 如果不是,那么为什么将它称为UTF-8?如果它们占用相同的内存,为什么我们需要UTF-16和其他代码?     

解决方法

        每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集(无借口!)作者:Joel Spolsky-2003年10月8日,星期三 摘录自:   因此发明了UTF-8的出色概念。 UTF-8是另一个使用8位字节将Unicode代码点的字符串(那些神奇的U +数字)存储在内存中的系统。在UTF-8中,从0-127的每个代码点都存储在一个字节中。实际上,只有代码点128和更高的代码点才使用2、3(最多6个字节)存储。   这样做的好处是,英语文本在UTF-8中的外观与在ASCII中的外观完全相同,因此美国人甚至不会发现任何错误。只有世界其他地方才可以跳过障碍。具体来说,Hello,即U + 0048 U + 0065 U + 006C U + 006C U + 006F,将被存储为48 65 6C 6C 6F,这是!与存储在ASCII和ANSI中以及地球上每个OEM字符集相同。现在,如果您大胆使用重音字母,希腊字母或克林贡字母,则必须使用多个字节来存储单个代码点,但美国人永远不会注意到。 (UTF-8还具有不错的属性,即希望使用单个0字节作为空终止符的无知的旧字符串处理代码不会截断字符串)。      到目前为止,我已经告诉您三种编码Unicode的方法。传统的“两字节存储”方法称为UCS-2(因为它有两个字节)或UTF-16(因为它有16位),您仍然必须弄清楚它是否高endian UCS-2或低端UCS-2。而且,流行的新UTF-8标准具有很好的特性,如果英语文本和Braindead程序的巧合完全没有引起人们的注意,那么ASCII也可以正常工作。      实际上,还有许多其他编码Unicode的方式。有一个叫做UTF-7的东西,它很像UTF-8,但是保证高位始终为零,因此,如果您必须通过认为是7的严酷的警察状态电子邮件系统传递Unicode,足够多了,谢谢,它仍然可以毫发无损地挤过。 UCS-4具有将每个代码点存储在4个字节中的功能,它具有一个很好的特性,即每个单个代码点都可以存储在相同数量的字节中,但是,天哪,即使是德州人也不会那样做大胆地浪费那么多内存。      实际上,现在您正在考虑用Unicode代码点表示的柏拉图式理想字母来思考事物,那些unicode代码点也可以用任何老式的编码方案进行编码!例如,您可以使用ASCII编码Hello(U + 0048 U + 0065 U + 006C U + 006C U + 006F)的Unicode字符串,或者使用旧的OEM希腊编码,希伯来ANSI编码或数百种编码中的任何一种到现在为止已经发明了,只有一个问题:有些字母可能不会出现!如果您要表示的Unicode代码点中没有与之等效的代码,通常会出现一个问号:或者,如果您真的很好,那就放一个盒子。你得到了什么? ->�      有数百种传统编码,它们只能正确存储一些代码点,而将所有其他代码点更改为问号。某些流行的英语文本编码是Windows-1252(西欧语言的Windows 9x标准)和ISO-8859-1,又名Latin-1(对任何西欧语言也有用)。但是,尝试以这些编码存储俄语或希伯来语字母,则会出现很多问号。 UTF 7、8、16和32都具有能够正确存储任何代码点的优点。     ,“ 8位”编码表示编码的各个字节使用8位。相比之下,纯ASCII是7位编码,因为它只有代码点0-127。过去,该软件在8位编码方面存在问题;使用Base-64和uuencode编码的原因之一是通过未处理8位编码的电子邮件系统获取二进制数据。但是,距那已经不再是一个问题,已经过去了十年或更长时间-软件必须是8位纯净的,或者能够处理8位编码的。 Unicode本身是一个21位字符集。它有多种编码: UTF-32,其中每个Unicode代码点均以32位整数存储 在UTF-16中,许多Unicode代码点存储在单个16位整数中,但有些需要两个16位整数(因此每个Unicode代码点需要2或4个字节)。 UTF-8中的Unicode代码点可能需要1、2、3或4个字节来存储单个Unicode代码点。 因此,“ UTF-8可以由1-4个字节表示”可能不是最合适的措辞方式。 \“ Unicode代码点可以用UTF-8中的1-4个字节表示\”会更合适。     ,        UTF-8是8位可变宽度编码。 Unicode中的前128个字符用UTF-8编码表示时,表示形式为ASCII字符。 为了进一步理解这一点,Unicode将字符视为代码点-可以以多种方式(编码)表示的纯数字。 UTF-8是一种这样的编码。它是最常用的,因为它在所有编码中提供了最佳的空间消耗特性。如果您以UTF-8编码存储来自ASCII字符集的字符,那么UTF-8编码的数据将占用相同的空间。这允许以前使用ASCII的应用程序无缝地移动(嗯,虽然不完全,但是肯定不会导致类似Y2K的问题)移动到Unicode,因为字符表示是相同的。 我将在RFC 3629中保留有关UTF-8编码工作原理的摘录:
   Char. number range  |        UTF-8 octet sequence
      (hexadecimal)    |              (binary)
   --------------------+---------------------------------------------
   0000 0000-0000 007F | 0xxxxxxx
   0000 0080-0000 07FF | 110xxxxx 10xxxxxx
   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
您会注意到,为什么编码会导致字符占据Unicode(左列)中不同字符范围的1-4个字节(右列)之间的任意位置。 UTF-16,UTF-32,UCS-2等将采用不同的编码方案,其中的代码点将表示为16位或32位代码,而不是UTF-8表示的8位代码。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...