Unicode 为什么有人使用UTF-8以外的编码?

Unicode 为什么有人使用UTF-8以外的编码?,unicode,encoding,utf-8,Unicode,Encoding,Utf 8,我想知道为什么任何开发人员都需要使用UTF-8以外的编码。有时,由于历史原因/不受支持的原因,这些编码受到限制(我在Windows上使用Zend Studio在Linux机箱上的Samba共享上进行开发:这种混合中的某些东西意味着我一直恢复到Cp1512而不是UTF8) 有时您不需要使用UTF-8(例如,在数据库中存储md5哈希时:您只需要十六进制范围0-9 a-F:为什么要将其设置为UTF-8字段,这将占用至少一个字节的额外存储空间,而不是正常的ASCII) 有时学习特定语言的UTF-8函数只

我想知道为什么任何开发人员都需要使用UTF-8以外的编码。

有时,由于历史原因/不受支持的原因,这些编码受到限制(我在Windows上使用Zend Studio在Linux机箱上的Samba共享上进行开发:这种混合中的某些东西意味着我一直恢复到Cp1512而不是UTF8)

有时您不需要使用UTF-8(例如,在数据库中存储md5哈希时:您只需要十六进制范围0-9 a-F:为什么要将其设置为UTF-8字段,这将占用至少一个字节的额外存储空间,而不是正常的ASCII)


有时学习特定语言的UTF-8函数只是懒惰。

一个合理的原因是当您需要处理与Unicode不兼容的遗留文档、软件或硬件时

另一个合理的原因是您需要使用不支持UTF8/Unicode的编程语言/库。。。或者根本没有

其他答案提到,对于亚洲语言/字符,UTF-16比UTF-8更紧凑


当然也有一些原因,比如短视、无知、懒惰。。。和截止日期。

维基百科列出了UTF-8与各种其他编码相比的优缺点:


最重要的缺点是UTF-8可能会大大占用更多的空间,特别是在亚洲语言中,如汉语、日语或印地语,并且并非所有代码点都具有相同的大小,这使得测量更加困难,许多字符串操作(如搜索)效率低下

因为您有时希望在代码点上轻松操作,所以您可以选择f.e.UCS-2或UCS-4。在UTF-8中
0800
FFFF
之间的代码点在UTF-8中占用三个字节,但在UTF-16中仅占用两个字节。有关更多详细信息,请参阅,但基本上,如果文本大量使用此范围内的代码点(例如,如果是中文),UTF-8文件将比具有相同内容的UTF-16文件大。

在某些情况下(需要非拉丁字符集),也值得记住这一点UTF-8实际上可能比16位Unicode编码更大。在这些情况下,ucs-2或utf-16将是一个更好的选择。

在大多数情况下,Unicode当然是一个很好的工作场所,但开发人员应该熟悉许多不同类型的字符编码。当然,如果字符集有限,可以使用ASCII

如果您是一名开发人员,从一个不发送UTF-8的源接收数据,该怎么办?如果你不理解你的输入,可能会有很多接口问题


关于字符编码的必备知识是好的,值得一读。

UTF-8在编码纯英语文本(与ASCII相同)方面非常有效。如果你的用户群大部分是中国人,那么使用UTF-16会更好


有关更多信息,请参阅。

许多API需要其他Unicode编码-主要是UTF-16。例如,Java、.NET、Win32。

有些人这样做是因为他们的工具过时或有缺陷。有些人这样做是因为他们认为不需要支持ASCII以外的任何东西。有些人这样做是因为他们不知道更多

这些是不使用Unicode的常见借口

至于不使用UTF-8,有不同的原因。有些系统,如Windows1(以及由此产生的.NET)和Java,出现在Unicode是严格的16位代码的时代。因此,实际上只有一种编码:UCS-2,直接将代码点编码为16位字

后来Unicode扩展到21位,因为65536个代码点已经不够了。这导致出现UTF-32和UTF-16等编码。对于以前使用UCS-2的系统,过渡到UTF-16是最简单、最明智的选择。Windows早在Windows 2000的早期就实现了这一转变

所以,虽然我认为现在几乎所有的应用程序都应该支持Unicode,但我认为他们完全没有必要专门使用UTF-8。这是有历史原因的,将现有系统从UTF-16转换为UTF-8并没有真正的好处



1 NT。

在我以前的雇主,我们对一些ASP页面使用iso-8859-1,以匹配SQL Server的排序规则,正如您所猜测的,SQL Server不是Unicode。我想更改排序规则,但经理说要等到我们升级SQL Server后再做。不用说,这从未发生过——我已经有一年多没有和他们在一起了,所以我不知道他们是否最终做到了。

因为他们不太清楚。 对utf-8唯一有效的批评是,通用亚洲语言的编码比其他编码过大。 UTF-8的优越性在于

  • 它是ASCII兼容的。大多数已知和尝试过的字符串操作都不需要自适应。
  • 它是Unicode。在这个时代,任何不是Unicode的东西都不应该被考虑。如果你有编码X的重要数据,花两分钟在Google上写一个转换函数。即使您必须与sourceless legacy Appz进行交互,您也可以通过管道运行通信,这样您的逻辑才能在21世纪保持不变。
  • UTF-16也不是固定长度,假设它和许多人一样,只会导致可怕的错误。
  • 此外,Unicode非常复杂,几乎可以肯定,即使在UTF-32中,任何从ASCII改编的固定大小算法也会产生不好的结果。
假设你有这个UTF-16字符串

[0][1][2][F|3] [4] [5]
您希望插入一个代码为8的字符,介于[3]和[4]之间 您可以插入(5,8)

如果您没有检查BMP以外的字符(在UTF-8中按顺序排列,因为您无法知道有多少个双倍大小的字符),您将得到:

两个新的垃圾字符。固定大小的编码到此为止。 当然,您可以完全禁止这些字符,但是当您的代码与现实世界交互时,您可能会发现您的程序
[0][1][2][F|8][3][4][5]