【问题标题】:Difference between Unicode, UTF-8 and code pagesUnicode、UTF-8 和代码页之间的区别
【发布时间】:2021-01-22 00:41:50
【问题描述】:

谁能解释一下 Unicode、UTF-8 和代码页之间的区别?它们之间有关系吗?

【问题讨论】:

    标签: unicode encoding utf-8 character


    【解决方案1】:

    Unicode 为每个字符定义了一个数值(代码点)。

    代码页/字符集编码定义了字节和 Unicode 代码点之间的关系。由于文件通常由字节组成,因此确定这一点很有用。

    UTF-8 是 Unicode 代码点的特定字节编码。例如,在 Windows 上,它被实现为代码页 65001。

    【讨论】:

      【解决方案2】:

      Unicode 是一个标准,它定义了字符、它们的编码等等(规范化、小写转换、大写、数值(数字字符的)、整理/排序、字符特征等)

      所以,在 Unicode (UnicodeData.txt) 中你有

      0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
      

      所以字母“LATIN CAPITAL LETTER A”的代码是U+0041,它是一个大写字母(Lu作为General Category),它不应该被重新排序(它不是一个组合char)、0,它是一个 Left_To_Right (L) 字母(在显示文本时很有用),如果字符写在 Right_To_Left (N) 中,则不会镜像,并且 @ 987654328@ 是另一种情况(它是 LATIN SMALL LETTER 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、“ANSI”、Latin-1 等

      注意:Unicode 的一个原则也是能够在不丢失信息的情况下将大多数其他编码(Unicode 之前)转换为 Unicode 并返回。这是 Unicode 成功的一个原因:它是几乎所有其他编码的严格超集。

      在 Unicode 之前,我们有许多其他编码,通常只有 8 位编码。 8bit 表示 256 个字符,不足以表示任何语言。因此,我们有许多不同的编码,例如每个语言/组一个(通常还不够,所以有各种技巧,或者只是在更高级别的协议中定义一些字符,例如您可能在书中看到的许多排版符号(例如 m-dash,各种引用字符,脚注符号(可能还有希腊字母等)。在 Unicode 之前和开始时,我们已经标准化了 ISO/IEC 8859(例如 Latin-1),Microsoft Windows 扩展(使用保留字符到“Windows ANSI”编码. 但是早期的 Windows 和 DOS 有许多其他的编码。

      现在,“代码页”是一个旧术语,当时视频内存只是一块文本。例如。在早期的 PC 中,我们有 80 列 x 25 行的文本。它在内存中以 80x25 字节表示,每个字节代表一个字符。另一个表(可能只是在视频卡内存中)具有 256 个字符的像素表示。这些是“代码页”:字符的图形表示。它与 encoding 非常相似,但它起源于编码之前,并且处理方式不同。在 DOS 中,您可能会更改代码页,但程序可能不知道它,因此它可能打印一个字符,但您可能会看到不同的字符。

      注意:代码页还包括框字符,用于控制台界面,可能还有其他符号,它也可能使用“控制字符”。您不能显示“新行”,因此您可以将此类代码用于其他符号(以及在精确位置打印此类符号的不同方式)。因此,这将编码(例如 ASCII)与代码页区分开来,但这只是一个历史兴趣。现在我们主要使用代码页作为编码,并且总是不考虑ASCII控制代码部分中的最终符号。这只是因为我们在这种时候使用了术语cp(代码点)。

      【讨论】:

        【解决方案3】:

        代码页是关于如何将字符(以及字符串)存储为数据的约定。例如,ASCII 代表 128 个字符……嗯,128 个数字。你可以看一下table here,比如大写的G是数字71,字符'0'是48。

        ASCII 最初很流行,但它只支持非常有限的字符集。世界各地发生了巨大的麻烦,因为韩国人会使用一组单独的代码页来对韩语进行编码,俄罗斯人使用不同的代码页来支持西里尔文,......所以出现了支持大多数语言字符的 Unicode,现在甚至支持表情符号。它只是另一个代码页,但它具有适用于大多数语言的大型支持系统。

        UTF-8 是一种在实际数据中存储 unicode 的方式。 8 指 8 位;也就是说,UTF-8 的每个字符最多可以占用 8 位来存储。 UTF-16 是另一种存储 unicode 的方式。存储数据最多需要 16 位,并且在某些情况下使用的空间比 UTF-8 少。然而,如今,UTF-8 是迄今为止最流行的 unicode 编码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-26
          • 2012-06-13
          • 1970-01-01
          • 2017-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多