根据Wikipedia UTF-8页面,我从人们那里听到了相互矛盾的意见。
它们是一样的,不是吗?有人可以澄清吗?
为了扩展其他人给出的答案:
我们有很多语言,有很多字符,计算机应该理想地显示。Unicode 为每个字符分配一个唯一的数字或代码点。
计算机处理诸如字节之类的数字......在这里跳过一点历史并忽略内存寻址问题,8位计算机会将8位字节视为硬件上容易表示的最大数字单位,16位计算机将扩展到两个字节,依此类推。
ASCII 等旧字符编码来自(前)8 位时代,并试图将当时的主要计算语言,即英语,塞进从 0 到 127(7 位)的数字。字母表中有 26 个字母,包括大写和非大写形式、数字和标点符号,效果都很好。对于其他非英语语言,ASCII 被扩展了第 8 位,但通过此扩展提供的额外 128 个数字/代码点将根据所显示的语言映射到不同的字符。ISO-8859 标准是这种映射最常见的形式;ISO-8859-1 和 ISO-8859-15(也称为 ISO-Latin-1、latin1,是的,8859 ISO 标准也有两个不同的版本)。
但是,当您想要表示来自一种以上语言的字符时,这还不够,因此将所有可用字符塞进一个字节是行不通的。
本质上存在两种不同类型的编码:一种通过添加更多位来扩展值范围。这些编码的示例是 UCS2(2 字节 = 16 位)和 UCS4(4 字节 = 32 位)。它们本质上与 ASCII 和 ISO-8859 标准存在相同的问题,因为它们的值范围仍然有限,即使限制要高得多。
另一种类型的编码使用每个字符的可变字节数,最常见的编码是 UTF 编码。所有 UTF 编码的工作方式大致相同:您选择一个单位大小,对于 UTF-8 是 8 位,对于 UTF-16 是 16 位,对于 UTF-32 是 32 位。然后,该标准将其中一些位定义为标志:如果设置了它们,则单元序列中的下一个单元将被视为同一字符的一部分。如果未设置,则此单位完全代表一个字符。因此,最常见的(英文)字符在 UTF-8 中仅占用一个字节(在 UTF-16 中为两个,在 UTF-32 中为 4 个),但其他语言字符可以占用六个字节或更多。
多字节编码(上面的解释我应该说多单元)的优点是它们相对节省空间,但缺点是查找子字符串、比较等操作都必须将字符解码为 unicode 码可以执行此类操作之前的点(尽管有一些快捷方式)。
UCS 标准和 UTF 标准都对 Unicode 中定义的代码点进行编码。理论上,这些编码可以用来编码任何数字(在编码支持的范围内)——当然,这些编码是用来编码 Unicode 代码点的。这就是他们之间的关系。
Windows 将所谓的“Unicode”字符串处理为 UTF-16 字符串,而如今大多数 UNIX 系统默认为 UTF-8。HTTP 等通信协议往往最适合 UTF-8,因为 UTF-8 中的单位大小与 ASCII 中的相同,并且大多数此类协议都是在 ASCII 时代设计的。另一方面,UTF-16 在表示所有现存语言时提供了最佳的 平均 空间/处理性能。
Unicode 标准定义的代码点少于 32 位可以表示的代码点。因此,出于所有实际目的,UTF-32 和 UCS4 成为相同的编码,因为您不太可能必须处理 UTF-32 中的多单元字符。
希望补充一些细节。