有人能解释一下Unicode、UTF-8和代码页之间的区别吗?他们彼此有亲戚关系吗?
Unicode是一个定义字符及其编码等(规范化、小写、大写转换、(数字字符的)数值、排序规则、字符特征等)的标准
因此,在Unicode(UnicodeData.txt)中,您有
0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
所以字母";CCD_ 1";具有代码U+0041
,它是一个大写字母(Lu
为通用类别),不应重新排序(它不是组合字符),0
,它是左_To_右(L
)字母(在显示文本时很有用),如果字符写入Right_To_Left(N
),则不镜像,U+0061
是备用大小写(它是拉丁小字母a。
注意:还有更多的文件和规则。有时规则更复杂(例如,另一种情况:它可能由更多的字符组成)。
因此,Unicode给出了一个代码(例如,对于拉丁大写字母a,Unicode标准,非常长,它也有很长的字母描述,这可能有助于您找到"Unicode名称")。显示器、文本处理器、字体引擎等等,他们只关心Unicode(以及字符的含义和属性)。
Unicode也定义了编码。我们需要一种表示代码点的方法(例如U+0041
)。Unicode定义了不同的编码:UTF-16、UTF-16LE、UTF-16BE、UTF-32、UTF32LE、UTF-32BE、UTF-8。根据编码,Unicode序列将以不同的方式翻译成二进制文本。UTF-8很受欢迎,因为它与ASCII兼容(ASCII文本也是UTF-8文本)。注意:UTF-8是一种可变长度编码,因此有些字符用一个字节表示,有些字符用2、3或4个字节表示(这是主要缺点,因此在内部,许多语言和操作系统使用UTF16或UTF32)。
文件和各种协议(如电子邮件、html文档)关心如何(在数字/数字介质上)传输数据,因此它们必须对字符串进行编码(也必须将字节流解码为字符串)。UTF-8只是编码Unicode字符串的一种方式,在任何情况下,您都可能有非Unicode编码,例如ASCII、"UTF-8";ANSI";,Latin-1等
注意:Unicode的一个原则是能够将大多数其他编码(前Unicode)转换为Unicode并返回,而不会丢失信息。这就是Unicode成功的原因:它是几乎所有其他编码的严格超集。
在Unicode之前,我们有许多其他编码,通常只有8位编码。8bit表示256个字符,这些字符不足以表示任何语言。所以,我们有很多不同的编码,例如,每个语言/组一个(通常还不够,所以使用各种技巧,或者在更高级别的协议中只定义一些字符,例如你可能在书中看到的许多印刷符号(例如m-dash、各种引用字符、脚注符号(可能还有希腊字母等)。在Unicode之前和开始时,我们已经标准化了ISO/IEC 8859(例如Latin-1),微软Windows扩展(使用保留字符到"Windows ANSI"编码。但早期的Windows和DOS有许多其他编码。
现在,";代码页";是一个古老的术语,当时视频记忆只是一块文本。例如,在早期的PC中,我们有80列x 25行的文本。它在内存中用80x25字节表示,每个字节表示一个字符。另一个表(可能只是在视频卡存储器中)具有256个字符的像素表示。这些是";代码页":字符的图形表示。它与编码非常相似,但它起源于编码之前,并且处理方式不同。在DOS中,你可以更改代码页,但程序可能不知道它,所以它可能打印一个字符,但你可能会看到不同的字符。
注意:代码页还包括框字符,用于控制台界面,可能还有其他符号,它也可能使用"控制字符";。您不能显示";"新行";,因此,您可以将此类代码用于其他符号(以及在精确位置打印此类符号的不同方式)。因此,这种将编码(例如ASCII)与代码页区分开来,但这只是一种历史兴趣。现在我们大多使用代码页作为编码,而总是不考虑ASCII控制代码部分的最终符号。这只是因为我们在这样的时间使用了术语cp
(代码点)。
Unicode为每个字符定义一个数值(代码点)。
代码页/字符集编码定义字节和Unicode代码点之间的关系。由于文件通常由字节组成,因此确定这一点非常有用。
UTF-8是Unicode代码点的特定字节编码。例如,在Windows上,它被实现为代码页65001。
代码页是关于如何将字符(以及字符串)存储为数据的约定。例如,ASCII表示128个字符。。。嗯,128个数字。你可以看看这里的表格。例如,大写G是数字71,字符LATIN CAPITAL LETTER A
0是48。
ASCII最初很流行,但它只支持非常有限的一组字符。一个巨大的麻烦发生在世界各地,因为韩国人会使用一组单独的代码页来编码韩语,俄罗斯人使用不同的代码页支持西里尔文。。。Unicode也是如此,它支持大多数语言字符,现在甚至支持表情符号。这只是另一个代码页,但它有一个适用于大多数语言的大型支持系统。
UTF-8是在实际数据中存储unicode的一种方式。8是指8位;也就是说,UTF-8的每个字符最多可以存储8位。UTF-16是存储unicode的另一种方式。它最多可以使用16位来存储数据,而且在某些情况下比UTF-8使用更少的空间。然而,如今,UTF-8是迄今为止最流行的unicode编码。