UTF-8和ISO-8859-1有什么区别?
UTF-8和ISO-8859-1有什么区别?
Answers:
UTF-8是一种多字节编码,可以表示任何Unicode字符。ISO 8859-1是单字节编码,可以表示前256个Unicode字符。两者对ASCII的编码方式完全相同。
Wikipedia很好地解释了两者:UTF-8与Latin-1(ISO-8859-1)。前者是可变长度编码,后者是单字节固定长度编码。Latin-1仅编码Unicode字符集的前256个代码点,而UTF-8可以用于编码所有代码点。在物理编码级别上,只有0-127的代码点得到相同的编码。代码点128-255的不同之处在于,使用UTF-8变成2字节序列,而使用Latin-1则变为单字节。
UTF是一系列多字节编码方案,可以表示Unicode代码点,最多可以表示2 ^ 31 [大约20亿]个字符。UTF-8是一种灵活的编码系统,使用1到4个字节表示前2 ^ 21 [大约200万]个代码点。
长话短说:任何代码点/序号表示低于127(又名7位安全ASCII)的字符都由与大多数其他单字节编码相同的1字节序列表示。代码点高于127的任何字符都由两个或多个字节组成的序列表示,此处详细说明了编码的细节。
ISO-8859是一系列单字节编码方案,用于表示可以在127到255范围内表示的字母。这些各种字母被定义为ISO-8859- n格式中的“部分”,这是最常见的这些可能是ISO-8859-1又名“ Latin-1”。与UTF-8一样,无论使用哪种编码系列,7位安全ASCII都不会受到影响。
这种编码方案的缺点是无法容纳由128个以上的符号组成的语言,或者一次不能安全地显示一个以上的符号系列。同样,随着UTF的兴起,ISO-8859编码也不再受欢迎。负责它的ISO“工作组”于2004年解散,由其上级小组委员会负责维护工作。
ISO-8859-1是1980年代的遗留标准。它只能代表256个字符,因此仅适用于西方世界的某些语言。即使对于许多受支持的语言,也缺少一些字符。如果使用此编码创建文本文件并尝试复制/粘贴一些汉字,则会看到奇怪的结果。所以换句话说,不要使用它。Unicode已经占据了全世界,而UTF-8几乎是当今的标准,除非您有一些遗留的原因(例如HTTP标头需要与所有内容兼容)。
从另一个角度来看,由于unicode和ascii编码中都包含一个字节0xc0
,因此它们均无法读取,因此iso-8859-1似乎可以正确读取。需要注意的是,该文件中当然不应包含Unicode字符。
要实现的另一件重要事情:如果看到的话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水平椭圆, …
)。
在WHATWG编码规范(13759 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。
我研究这个问题的原因是从角度来看的,它们以什么方式兼容。Latin1字符集(iso-8859)100%兼容,可以存储在utf8数据存储区中。所有ascii和extended-ascii字符都将存储为单字节。
相反,从utf8到Latin1字符集可能有效,也可能无效。如果有任何2字节字符(超出扩展的ASCII 255的字符),它们将不会存储在Latin1数据存储区中。