ISO-8859-1和UTF-8有什么区别?

52

什么时候应该使用什么字符集?使用UTF-8总是更好吗?还是ISO-8859-1在特定情况下仍然很重要?

字符集是否与地理区域有关?


使用 @charset "utf-8"; 这段代码有什么好处吗?

或者像这样 <link type="text/css; charset=utf-8" rel="stylesheet" href=".." /> 放在 CSS 文件的顶部呢?

我找到了如下内容:

如果 Dreamweaver 在向文档添加嵌入式样式时会添加标签, 那么这是 Dreamweaver 的一个错误。来自 W3C 常见问题解答:

"对于嵌入在文档中的样式声明,不需要使用 @charset 规则并且不得使用。"

从 2.0 版本(1998 年 5 月)开始,字符集规范就是 CSS 的一部分,因此如果你在 CSS 文件中有字符集规范且 Safari 无法处理它,则这是 Safari 的一个错误。

并在表单中添加 accept-charset

<form action="/action" method="post" accept-charset="utf-8">

如果我使用XHTML doctype,应该使用什么?

<?xml version="1.0" encoding="UTF-8"?>

或者

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

即使在2009年,这也一定是一个重复的(?)。 - Peter Mortensen
5个回答

59

Unicode正在崛起并已经超越了其他编码。我建议你现在就加入这个大军。

请注意,Unicode有几种不同的版本。Joel Spolsky提供了一个概述

Unicode is winning (截至2012年2月,图表数据,请查看下面的评论以获取更精确的值。)


9
现在大部分的网页都采用UTF-8编码:http://w3techs.com/technologies/overview/character_encoding/all - dan04
4
“flavors of Unicode”的意思是有不同的方法来编码Unicode,为了明确无误。 - Peter
谢谢你提供的链接,这是我最近看到的最简洁、最恰当命名的文章。 - atw

8

UTF-8在网络上得到广泛支持,只有在特定应用程序中才不被支持。如果可以的话,您应该始终使用UTF-8。

缺点是对于像中文这样的语言,UTF-8需要比UTF-16更多的空间。但是,即使您计划使用中文,UTF-8也是可以接受的。

使用UTF-8唯一的缺点是它占用的空间比其他编码方式要多,但与西方语言相比,它几乎不占用额外空间,除了一些非常特殊的字符,而对于这些额外的字节,您可以容忍。毕竟,现在是2009年。 ;)


1
严格来说,这不是唯一的缺点。另一个缺点是它是可变长度编码,一些旧代码仍然会遇到这个问题。 - Joachim Sauer
是的,但正如我所说的,我谈论的是 Web 上的 utf-8,而不是编程中的。 ;) - Tor Valamo
@Joachin Sauer,你要么支持编码,要么不支持。是的,所有ASCII都是有效的UTF-8,但为什么会有人期望使用ASCII解码器成功解码UTF-8呢? - Peter
Utf-8在网络上得到广泛支持,但是UTF-8是否支持所有字符(比如使用不同的语言)?我只是好奇。 - kta
@kta - 是的,utf-8目前是符号集最大的编码方式,每年都会添加新的(虽然有些晦涩难懂)脚本。从技术上讲,UTF-8每个符号可以有多达6个字节(48位)(在它运行到每个字节的位置元数据时就会用完空间),其中大约24个字节可以有数据(其他是元数据),因此最多可能有2^24个符号。PS:数字可能有误,但你明白我的意思。 - Tor Valamo

3
如果您想实现世界霸权,请全程使用UTF-8,因为它涵盖了世界上所有可用的人类字符,包括亚洲、斯拉夫、希伯来、阿拉伯、希腊等,而ISO-8859仅限于拉丁字符。您不想出现乱码的情况。

1
@BalusC,实际上您需要转换为UTF-16才能涵盖“世界上所有可用的人类字符”。 - Rob Wells
3
@Rob:不,UTF-8 包含了所有人类字符。唯一的区别是 UTF-16 在保存例如中文这样的语言时采用不同的编码点来节省空间。UTF-16 是一个非常不稳定的字符集,因为它无法识别错误。 - Tor Valamo
1
这是一个非常罕见的情况,因为UTF-8涵盖了与ISO-8859-1字符相同的代码点(但并非所有其他ISO-8859-x集合!)。只需始终使用UTF-8,并在必要时转换“错误”的字符。在Web开发方面,您需要确保至少以下内容:1)以UTF-8保存源代码文件。2)将HTTP响应头设置为UTF-8。3)将HTTP请求头设置为UTF-8(如果尚未由客户端设置)。4)将数据库表设置为UTF-8。 - BalusC
2
@BalusC:不,所有的 ISO-8859-x 字符,对于任何 x 的值,都是 Unicode 字符。所有的 Unicode 字符都有一个编号/码点,而 UTF-8 只是该数字的可变长度编码。因此,不难得出结论,不同的 ISO-8859-x 编码中的大约 800 个字符都有 UTF-8 编码。 - MSalters
2
哦哦。你对UTF-8的理解是错误的。以你举的例子为例,0xA4不是一个有效的UTF-8字符。它可以是UTF-8字符的第二、第三或第四个字节。例如,U+20A4 是三字节的UTF-8序列0xE2,0x82,0xA4,货币符号U+00A4 ¤ 是两字节的UTF-8序列0xC2, 0xA4。(0xA4重复是巧合;例如U+00E4不是0xC2, 0xE4) - MSalters
显示剩余8条评论

1
我发现ISO 8859-1在一些客户向我发送使用WordPublisher创建的文本文件的网站上非常有用,我可以轻松地将它们插入到PHP代码中,而不必担心引号等问题。这些是美国本地公司,在页面文本上没有任何其他差别,因此我认为在这些特定页面上使用该字符集没有任何劣势。所有其他页面都使用UTF-8。

这是一个好的方法,因为不需要所有东西都符合“全球标准”,只有在常识建议时才需要。 - Raul Lapeira Herrero

-2
  • ISO 8859-1是一种很好的编码方式,适用于空间有限且您只需要对其支持的基本拉丁语言进行编码。而且您永远不会考虑升级应用程序以支持非拉丁语言。

  • UTF-8是一种绝妙的方式,可以(a)使用已经存在的每个字符8位代码库的大型代码库,或者(b)成为欧洲势利眼。UTF-8将标准ASCII编码为每个字符一个字节,Latin 1为每个字符2个字节,东欧和亚洲语言为每个字符3个字节。如果您开始尝试对不存在于基本多语言平面中的古代语言进行编码,则可能会增加到每个字符四个字节。

  • UTF-16是从头开始创建新代码库的好方法。它完全与文化无关 - 每个人都可以公平地获得两个字节的字符。对于古代/异国语言,它确实需要每个字符四个字节 - 这意味着,在最坏的情况下,它与其大哥一样糟糕:

  • UTF-32是浪费空间。


2
utf16是文化中立的吗?每个人都可以获得公平的2个字节吗?与其在讨论中加入文化价值判断,为什么不将其保持在简明扼要的成本/效益分析上呢?即:如果被编码的字符主要是ASCII或拉丁字符,则UTF16是浪费空间的。如果不是,则不是。它是否是“新代码库”无关紧要。 - Cheeso
2
UTF-16是“完全文化中立的 - 每个人都可以公平地获得每个字符2个字节”,除了那些需要每个字符4个字节的文化?这是奥威尔的讽刺吗? :-) - Ken
@Ken:他们使用UTF-16,而不是UTF-32!Java和.NET都是如此。 - Joachim Sauer
顺便说一下:当你只需要拉丁语言时,ISO-8859-1甚至都不够用。它不支持欧元符号€,这非常重要。为此,您需要使用ISO-8859-15(或更好的编码方式:能够表示所有Unicode代码点的UTF-*系列)。 - Joachim Sauer
@Tor,实际上您需要检查最重要的2位。如果 b & 0xC0 == 0x80,那么它是一个续字节,所有其他字节都是引导字节或无效字节。此外,UTF-8编码/解码不受字节序影响,始终保持一致。 - Brian Reichle
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接