【发布时间】:2026-02-04 18:15:02
【问题描述】:
UTF-8 和 ISO-8859-1 有什么区别?
【问题讨论】:
标签: utf-8 character-encoding iso-8859-1
UTF-8 和 ISO-8859-1 有什么区别?
【问题讨论】:
标签: utf-8 character-encoding iso-8859-1
UTF-8 是一种多字节编码,可以表示任何 Unicode 字符。 ISO 8859-1 是一种单字节编码,可以表示前 256 个 Unicode 字符。两者编码 ASCII 的方式完全相同。
【讨论】:
【讨论】:
UTF 是一系列多字节编码方案,可以表示Unicode 代码点,最多可以表示 2^31 [大约 20 亿] 个字符。 UTF-8 是一个灵活的编码系统,它使用 1 到 4 个字节来表示前 2^21 [大约 200 万] 个代码点。
长话短说:代码点/序数表示低于 127 的任何字符,也就是 7 位安全 ASCII 由与大多数其他单字节编码相同的 1 字节序列表示。代码点高于 127 的任何字符都由两个或多个字节的序列表示,编码的细节最好解释here。
ISO-8859 是一系列单字节编码方案,用于表示可以在 127 到 255 范围内表示的字母表。这些不同的字母表以 ISO-8859- 格式定义为“部分” n,其中最熟悉的可能是ISO-8859-1 aka 'Latin-1'。与 UTF-8 一样,无论使用何种编码系列,7 位安全 ASCII 都不会受到影响。
这种编码方案的缺点是它无法容纳包含超过 128 个符号的语言,或者一次安全地显示多个符号系列。同样,随着 UTF 的兴起,ISO-8859 编码已经失宠。负责它的 ISO“工作组”已于 2004 年解散,将维护工作留给其上级小组委员会。
值得一提的是,微软还保持a set of character encodings 与 ISO-8859 的有限兼容性,通常表示为“cp####”。 MS 似乎在推动他们最近的产品版本以一种或另一种形式使用 Unicode,但出于遗留和/或互操作性的原因,您仍然可能会遇到它们。
例如,cp1252 是 ISO-8859-1 的超集,包含 0x80-0x9F 范围内的其他可打印字符,特别是欧元符号 € 和备受诟病的“智能引号”“”。这通常会导致不匹配,其中 8859-1 可以完美地显示为 1252,而 1252 可能似乎 可以很好地显示为 8859-1,但是当出现这些额外符号之一时会出现异常。
除了 cp1252,土耳其语 cp1254 是 ISO-8859-9 的类似超集,但所有其他 Windows 代码页至少存在一些基本冲突,如果与它们的 8859 等效项没有完全不同的话。
【讨论】:
ASCII:7 位。 128 个代码点。
ISO-8859-1:8 位。 256 个代码点。
UTF-8:8-32 位(1-4 字节)。 1,112,064 个代码点。
ISO-8859-1 和 UTF-8 都向后兼容 ASCII,但 UTF-8 不向后兼容 ISO-8859-1:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
输出:
©
b'\xc2\xa9'
b'\xa9'
【讨论】:
ISO-8859-1 是 1980 年代的遗留标准。它只能表示 256 个字符,因此仅适用于西方世界的某些语言。即使对于许多受支持的语言,也缺少一些字符。如果您以这种编码创建一个文本文件并尝试复制/粘贴一些中文字符,您会看到奇怪的结果。所以换句话说,不要使用它。 Unicode 已经占领了世界,UTF-8 几乎是当今的标准,除非你有一些遗留的原因(比如需要与所有东西兼容的 HTTP 标头)。
【讨论】:
需要意识到的更重要的一点是:如果您看到iso-8859-1,它可能指的是Windows-1252,而不是ISO/IEC 8859-1。它们在 0x80–0x9F 范围内有所不同,其中 ISO 8859-1 具有 C1 控制代码,而 Windows-1252 具有有用的可见字符。
例如,ISO 8859-1 有 0x85 作为控制字符(在 Unicode 中,U+0085,``),而 Windows-1252 有一个水平省略号(在 Unicode 中,U+2026 HORIZONTAL ELLIPSIS,…) .
WHATWG Encoding spec(由 HTML 使用)明确声明 iso-8859-1 是 windows-1252 的标签,并且 Web 浏览器不以任何方式支持 ISO 8859-1:HTML 规范说必须支持编码规范,仅此而已。
同样有趣的是,HTML 数字字符引用基本上使用 Windows-1252 来表示 8 位值,而不是 Unicode 代码点;每https://html.spec.whatwg.org/#numeric-character-reference-end-state,… 将产生 U+2026 而不是 U+0085。
【讨论】:
从另一个角度来看,unicode 和 ascii 编码都无法读取的文件,因为它们中有一个字节 0xc0,似乎可以被 iso-8859-1 正确读取。需要注意的是,文件中当然不应包含 unicode 字符。
【讨论】:
我研究这个问题的原因是从这个角度来看,它们在什么方面是兼容的。 Latin1 字符集 (iso-8859) 100% 兼容存储在 utf8 数据存储中。所有 ascii 和扩展 ascii 字符都将存储为单字节。
换一种方式,从 utf8 到 Latin1 字符集可能有效,也可能无效。如果有任何 2 字节字符(扩展 ascii 255 之外的字符),它们将不会存储在 Latin1 数据存储中。
【讨论】: