什么字符编码最适合跨国公司

HGP*_*GPB 15 utf-8 utf-16 character-encoding utf-32

如果你有一个网站要翻译成世界上的每种语言,因此有一个包含所有这些翻译的数据库,哪种字符编码最好?UTF-128?

如果是这样,所有浏览器都了解所选的编码?字符编码是直接实现还是有隐藏因素?

提前致谢.

Bri*_*ell 31

如果要支持Web内容的各种语言,则应使用涵盖整个Unicode范围的编码.为此目的的最佳选择是UTF-8.UTF-8是网络的首选编码; 来自HTML5草案标准:

鼓励作者使用UTF-8.一致性检查员可能会建议作者不要使用遗留编码.[RFC3629]

创作工具应默认使用UTF-8来创建新创建的文档.[RFC3629]

UTF-8和Windows-1252是浏览器需要支持的唯一编码,UTF-8和UTF-16是XML解析器支持的唯一编码.因此,UTF-8是唯一需要支持所有内容的通用编码.


以下是对Liv答案的扩展回应,而不是对答案的回应; 它描述了为什么UTF-8优于UTF-16,即使对于CJK内容也是如此.

对于ASCII范围内的字符,UTF-8比UTF-16更紧凑(1字节对2).对于ASCII范围和U + 07FF(包括拉丁语扩展,西里尔语,希腊语,阿拉伯语和希伯来语)之间的字符,UTF-8每个字符也使用两个字节,因此它是一个清洗.对于Basic Multilingual Plane之外的字符,UTF-8和UTF-16每个字符使用4个字节,所以它在那里是一个清洗.

UTF-16比UTF-8更有效的唯一范围是从U + 07FF到U + FFFF的字符,其中包括印度语字母和CJK.即使对于该范围内的大量文本,UTF-8最终也具有可比性,因为该文本的标记(HTML,XML,RTF,或者你有什么)都在ASCII范围内,其中UTF-8是一半UTF-16的大小.

例如,如果我选择日语中的随机网页,即nhk.or.jp的主页,则以UTF-8编码.如果我将其转码为UTF-16,它将增长到原始大小的两倍:

$ curl -o nhk.html 'http://www.nhk.or.jp/'
$ iconv -f UTF-8 -t UTF-16 nhk.html > nhk.16.html
$ ls -al nhk*
-rw-r--r--  1 lambda  lambda  32416 Mar 13 13:06 nhk.16.html
-rw-r--r--  1 lambda  lambda  18337 Mar 13 13:04 nhk.html

UTF-8几乎在所有方面都比UTF-16更好.它们都是可变宽度编码,因此具有复杂性.然而,在UTF-16中,4字节字符是相当罕见的,因此更容易做出固定宽度假设并使一切正常工作,直到遇到你没有捕到的角落情况.在编码CESU-8中可以看到这种混淆的一个例子,如果您将UTF-16文本转换为UTF-8,只需将代理对的每一半编码为单独的字符(每个字符使用6个字节) ;三个字节用于编码UTF-8中代理对的每一半),而不是将该对解码为其代码点并将其编码为UTF-8.这种混淆很常见,错误的编码实际上已经标准化,因此至少可以使破坏的程序进行互操作.

对于绝大多数内容,UTF-8比UTF-16小得多,如果您关注大小,压缩文本总是比选择不同的编码更好.UTF-8与使用以null结尾的字节序列来表示字符串的API和数据结构兼容,因此只要您的API和数据结构不关心编码或者已经可以处理其字符串中的不同编码(例如作为大多数C和POSIX字符串处理API),UTF-8可以正常工作,而无需为宽字符设置全新的API和数据结构.UTF-16没有指定字节序,因此它可以处理字节序问题; 实际上有三种不同的相关编码,UTF-16,UTF-16BE和UTF-16LE.UTF-16可以是大端或小端,因此需要BOM指定.UTF-16BE和LE是big和little endian版本,没有BOM,所以你需要使用带外方法(例如Content-Type HTTP标头)来指示你正在使用哪一个,但是带状头部因错误或缺失而臭名昭着.

UTF-16基本上是一个意外,因为人们认为16位足以对所有Unicode进行编码,因此开始改变它们的表示和API以使用宽(16位)字符.当他们意识到他们需要更多字符时,他们想出了一个使用一些保留字符来使用两个代码单元编码32位值的方案,因此他们仍然可以使用相同的数据结构进行新编码.这带来了像UTF-8这样的可变宽度编码的所有缺点,没有大多数优点.

  • +100:**说得很好!** 我鄙视 UTF-16,尽管 UCS-2 让我更生气。Dan Kogai [在他的 `Encode::Unicode` Perl 模块的手册页中](http://search.cpan.org/~dankogai/Encode-2.42/Unicode/Unicode.pm#Surrogate_Pairs) 说:“至少可以说,代理对是 Unicode 联盟最大的错误。但根据已故的道格拉斯·亚当斯在《银河系漫游指南》三部曲中的说法,“宇宙最初是被创造的。” 这让很多人非常愤怒,并被广泛认为是一个糟糕的举动。“他们的错误没有这么严重,所以让我们原谅他们。” (2认同)

Mat*_*all 11

UTF-8是Unicode的事实标准字符编码.

UTF-8类似于UTF-16和UTF-32,因为它可以表示Unicode字符集中的每个字符.但与UTF-16和UTF-32不同,它具有向后兼容ASCII的优点.它的优点是避免了字节顺序的复杂性以及因此需要使用字节顺序标记(BOM).由于这些和其他原因,UTF-8已成为万维网的主要字符编码,占所有网页的一半以上.

没有UTF-128这样的东西.

  • UTF-128会很棒.64个字符的字符串权重1kb! (6认同)