信息技术数字 » 电脑 » 什么是UTF-8:定义、操作、错误和用途

UTF-8 使用 1-4 个字节对 Unicode 点进行编码,与 ASCII 兼容并且适用于任何语言。

自同步和验证:0/110/1110/11110 模式可防止重叠并更容易检测错误。

Web 和系统:元字符集、大量支持和在 Windows/macOS/Linux 上的轻松转换。

如果您今天阅读这篇文章时没有看到任何奇怪的符号,这要归功于 UTF-8。这种编码允许字母、重音符号、技术符号甚至表情符号在任何现代浏览器、操作系统或电子邮件客户端中平等地表示。 这是网络上最广泛的标准 以及我们所知的数字通信的基础。

当设备显示文本时,它实际上是在处理数字。。这些数字是 统一码标准 并将它们转换成通过网络传输或保存在文件中的字节, 我们进行转换:UTF-8在下面的几行中,您将了解它是什么、它如何工作、为什么建立它、它有哪些优点和局限性以及如何避免常见的错误。

什么是 UTF-8?

UTF-8(8 位 Unicode 转换格式)是一种将 Unicode 代码点转换为字节序列的方法。.其主要特点是使用 可变长度:有些字符占用 1 个字节,而其他字符则占用 2、3 或 4 个字节。这意味着 带有简单拉丁字符的文本紧凑,但 Unicode 字符集中的任何字符也可以表示。

它完全兼容 ASCII码:前 128 个字符(U+0000 到 U+007F)被编码为与 7 位 ASCII 相同的单个字节。 这有助于从旧系统过渡。 并解释了它在互联网、电子邮件和 IETF 协议中的成功的大部分原因。

UTF-8 因其稳健性而脱颖而出:包含同步位,可以可靠地识别每个符号的起始位置。这种自同步特性使得 如果序列“看起来”像 UTF-8,则很容易检测,在工具和解析器中非常有用的东西。

Unicode:一切的基础

Unicode 是为每个字符分配唯一编号的通用标准。,无论使用哪种语言、平台或应用程序。这个数字被称为 代码点 通常以十六进制表示,格式为 U+XXXX(或更多数字,如果需要)。

例如: 大写字母“A”的 U+0041在 HTML 中我们也可以将其称为 A. 你的计算机不会将 A “视为” 一个字母,而是数字 65,然后编码(例如 UTF-8)决定如何用字节表示该数字。

如果你想检查 Unicode 在你的电脑上是如何转换成字符的在 Windows 中,您可以按住 Alt 键并在数字键盘上键入十进制数字代码:例如, Alt+65 返回“A” (看到 完整的 Alt 代码列表)。这是一个经典的快捷方式,显示了您所看到的字符背后的代码。

一点历史:UTF-8 是如何诞生的

UTF-8 是由 Ken Thompson 于 2 年 1992 月 XNUMX 日根据 Rob Pike 的标准设计的。. 两者都在操作系统中实现了它 贝尔实验室的 Plan 9 并正式提出 USENIX(圣地亚哥,1993年XNUMX月). 在其标准化过程中,由 X/Open 联合国际化小组 (XOJIG), 它获得了诸如 FSS/UTF 和 UTF-2 等名称 直到它被确立为 UTF-8。

设计解决了实际问题 以前的通用编码尝试具有以下特点:ASCII 兼容性、自同步、字节之间没有重叠以及易于错误检测。 这种平衡使其成为网络事实上的标准。.

IT 创新:最新趋势UTF-8 的工作原理

UTF-8 根据编码所需的字节对字符进行分组。字节数完全取决于 Unicode 代码点,并遵循指示序列长度的位模式。

1 个字节(U+0000 至 U+007F):ASCII 字符。格式: 0xxxxxxx。最高有效位为 0,即 保证与 ASCII 直接兼容.

2 个字节(U+0080 至 U+07FF): 格式 110yyyyy 10xxxxxx. 它适用于大多数带有变音符号的欧洲字母以及其他字母,例如希腊文、西里尔文、希伯来文或阿拉伯文。.

3 个字节(U+0800 至 U+FFFF): 格式 1110zzzz 10yyyyyy 10xxxxxx. 包含多语言基本计划(BMP),带有 CJK(中文、日语、韩语)、技术符号和最常用的字符。

4 个字节(U+10000 至 U+10FFFF): 格式 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx. 代表补充平面:高级数学符号、历史著作、不太常见的表意符号等。

自同步的关键在于报头位:0 表示 ASCII;110 表示两个字节;1110 表示三个字节;11110 表示四个字节。 连续字节 他们总是从 10 开始。 多亏了 连续字节永远不能作为起始字节,并且有效序列永远不能是较长序列的子字符串(非重叠原则)。

与 UTF-16 和代理对的等效性

UTF-16 以 16 位为单位表示 BMP 代码点 并指向 U+FFFF 以上位置 替代对 在范围中 D800–DFFF。 相反 UTF-8 始终编码真实代码点,而不是 UTF-16 单位,这避免了与替代品混淆。

从历史上看,一些草案允许 5或6个字节 使用 UTF-8 来覆盖更广泛的范围,但是 Unicode 和 RFC 3629 将 UTF-8 限制为最多 4 个字节。ISO/IEC 曾经考虑过更广泛的选择,但它们不再是当前标准的一部分。

实际例子:ñ

字符“ñ”的代码点为U+00F1,它位于双字节范围内。按照该模式,它被编码为 110xxxxx 10xxxxxx. 其 UTF-8 表示形式为 0xC3 0xB1解码是相反的过程:读取有用的位并重建原始代码点。

UTF-8 的优点和局限性

主要优势:

ASCII 支持:ASCII 文本在 UTF-8 中有效,无需更改。

普遍:可以表示任何 Unicode 字符,包括技术符号和表情符号。

拉丁文本的效率:当使用 1 个字节表示 ASCII 时, 与 UTF-16 相比节省空间 在许多西方语言中。

自同步和检测:位模式允许 检测字符开头 并轻松验证序列。

限制和权衡:

CJK 文本比 UTF-16 文本占用更多空间,其中许多字符适合 2 个固定字节。

计算成本:长度可变,某些操作(例如“转到字符 n”) 需要从头开始并且某些任务在 UTF-16/UTF-32 中可能会更快。

UTF-8 中的 BOM(字节顺序标记)

UTF-8 不需要 BOM 因为字节顺序不会改变值的含义(最小单位是字节)。即便如此, 有一个可选的 BOM,字符 U+FEFF 编码为 EF BB BF 在文件或流的开头,可用于指示“这是 Unicode/UTF-8”。

计算机科学与数字技术:我们生活中的革命好的做法:如果它在启动时出现,某些系统会接受它,而其他系统则会按字面意思处理它。 在串联中,建议消除中间 BOM。它不是强制包含的,并且与 UTF-8/UTF-16 相比,它在 UTF-32 中的用途有限,在 UTF-XNUMX/UTF-XNUMX 中它标记 字节序.

典型的编码错误及其处理方法

强大的 UTF-8 解码器应该拒绝格式错误的序列 或者用 U+FFFD(替换字符)替换它们,否则会报错。最常见的错误是:

截短序列:没有足够连续性的多字节前导字节。

松散的连续字节: 出现 10xxxxxx 没有有效的前导字节。

超长:使用比必要更多的字节进行编码;例如,尝试使用 2 个字节对 ASCII 进行编码(0xC0 y 0xC1 无效).

禁止的长度: 开始建议 5 或 6 个字节(0xF8–0xFD 无效 使用标准 UTF-8 编码)。

超出Unicode范围的值: 不支持高于 U+10FFFF 的值;某些值(0xF5–0xF7 作为开端)是无效的。

UTF-16 代理对: D800–DFFF 不是有效的代码点 以 Unicode 表示;它们不应该以 UTF-8 编码出现。

当您在屏幕上看到“�”字符时,很可能是编码不匹配,或者文件保存在了不同的代码页中。解决方法是 强制端到端 UTF-8 (文件、服务器、数据库、HTTP 标头)。

网络和电子邮件中的 UTF-8

HTML 页面应该只声明一种编码出于兼容性和覆盖范围的考虑,建议使用 UTF-8 编码。请尽早在标头中包含元标记:

<meta charset="UTF-8">

将其放在 这样浏览器就可以在处理文档之前读取它。这可以避免出现不一致和字符损坏的情况。 UTF-8 在网络上的采用势不可挡,目前绝大多数网站都使用它。

在电子邮件中, UTF-8 得到广泛支持 并受到互联网邮件联盟等组织的推荐。 配置邮件客户端以使用 UTF-8 减少与其他语言的人交换信息时的问题。

UTF-8、UTF-16 和 UTF-32:有什么区别?

UTF-8:以8位为单位的可变长度; 非常适合网络高效处理 ASCII 和西方语言。出色的兼容性和错误检测能力。

UTF-16:以 16 位为单位的可变长度;使用 U+10000 及以上的代理对。 当非 ASCII 字符占主导地位时,通常具有优势,并用于许多 API 和平台(例如, Windows 以 UTF-16 格式原生运行).

UTF-32:每个字符固定长度32位; 索引非常简单,但占用空间。它适用于处理简单性比大小更重要的情况。

不兼容的变体:CESU-8 和“修改版 UTF-8”

CESU-8 直接编码 UTF-16 单元(包括代理对),而不是编码代码点, 这就是它与标准 UTF-8 不同的原因 用于 U+FFFF 以上的字符。一些历史平台曾使用过它: Oracle 8 为其提供了别名 UTF8 从 Oracle 9 开始,添加了另一个别名的 UTF-8 标准。 Java 和 Tcl 已经使用了 CESU-8 在某些情况下。

修改版 UTF-8 (例如,在 Java 环境中) 将 NUL 字符 (U+0000) 表示为 0xC0 0x80 而不是 0x00。 避免 C 字符串中的空字节 但它不符合 UTF-8 标准。这个“修改版”的许多实现也 遵守 CESU-8.

主板及其组件的工作原理Windows 和 API 上的 UTF-8:代码页和转换

Windows 内部以 UTF-16 (WCHAR) 运行,但从 Windows 10 版本 1903 开始​​,你可以 强制使用 UTF-8 作为进程代码页 通过应用程序清单(属性 activeCodePage)。这使得使用“-A” API 的旧代码可以更轻松地通过 UTF-8 运行。

API -A 与 -W: -A 取决于 ANSI 代码页 配置(可以是 CP_UTF8),而 -W 他们使用 UTF-16. 为了实现互操作, 的MultiByteToWideChar y 调用WideCharToMultiByte 允许您在 UTF-8 和 UTF-16 之间进行转换; 美国 CP_UTF8 并且,如果适用的话, MB_ERR_INVALID_CHARS 检测输入错误。

真正的兼容性:浏览器和系统

现代浏览器支持 UTF-8 (Chrome、Firefox、Safari、Edge、Opera 和最新版本的 Internet Explorer)以及 与大多数操作系统 (Windows、Linux、macOS、Android、iOS)。除了非常老的软件外, 你应该不会有任何问题.

如何将文件转换为 UTF-8

在 Windows 中(记事本):打开文件,转到“文件 > 另存为...”,然后在“编码”下选择 UTF-8。如果要保留原始文件,请使用新名称保存。

在 macOS 上(文本编辑):在“文本编辑 > 偏好设置 > 打开和保存”中,选择 Unicode(UTF-8) 保存时。然后在启用该选项的情况下导出文件。

在Linux上:您可以使用终端 iconv。 例如: iconv -f -t UTF-8 -o . 稍后检查 使用它的应用程序也需要 UTF-8。

如何知道文件是否为 UTF-8? 许多现代编辑器会在状态栏中显示这一点。如果您看到奇怪的字符,例如“�”、损坏的重音符号或错误显示的“ñ/ç”, 检查文件编码和编辑器/服务器/数据库设置.

避免意外的良好做法

尽快声明 UTF-8 在 HTML 和 HTTP 标头中。在整个堆栈(源文件、模板、数据库和连接)中对齐编码。 避免混合编码 在单个页面或流程上,使用验证/规范化输入的工具。

对于集成和 API,始终在标题中指定编码(Content-Type: application/json; charset=UTF-8(例如)。 使用多语言数据进行测试 (重音、CJK、表情符号)在生产之前检测弱点。

UTF-8 胜出,因为它在兼容性、效率和覆盖范围方面取得了平衡。这是确保文本在不同文化、系统和应用程序之间完整传输的最实用的方法,无论它是否包含重音符号、技术符号或非拉丁文字。

相关文章:什么是 Unicode:完整指南、用途和编码

目录

什么是 UTF-8?Unicode:一切的基础一点历史:UTF-8 是如何诞生的UTF-8 的工作原理与 UTF-16 和代理对的等效性实际例子:ñUTF-8 的优点和局限性UTF-8 中的 BOM(字节顺序标记)典型的编码错误及其处理方法网络和电子邮件中的 UTF-8UTF-8、UTF-16 和 UTF-32:有什么区别?不兼容的变体:CESU-8 和“修改版 UTF-8”Windows 和 API 上的 UTF-8:代码页和转换真正的兼容性:浏览器和系统如何将文件转换为 UTF-8避免意外的良好做法