Unicode和UTF-8有什么区别?

时间:2010-10-17 02:17:03

标签: unicode utf-8

考虑:

Alt text

unicode=utf16是否属实?

许多人都说Unicode是标准,而不是编码,但大多数编辑支持实际保存为Unicode 编码

9 个答案:

答案 0 :(得分:525)

正如拉斯穆斯在他的文章"The difference between UTF-8 and Unicode?"中所述(已修订链接):

  

如果问到这个问题,“UTF-8和。之间有什么区别?   Unicode?“,你会自信地回复一个短而精确的   回答?在国际化的这些日子里,所有的开发者都应该   能够做到这一点。我怀疑我们很多人都不理解这些概念   我们也应该这样做。如果你觉得自己属于这个群体,你应该这样做   阅读这篇关于字符集和编码的简短介绍。

     

实际上,比较UTF-8和Unicode就像比较苹果和   桔子:

     

UTF-8是一种编码 - Unicode是一个字符   设置

     

字符集是具有唯一编号的字符列表(这些   数字有时被称为“代码点”)。例如,在   Unicode字符集, A 的编号为41。

     

另一方面,编码是一种翻译a的算法   二进制数字列表,以便存储在磁盘上。例如   UTF-8会像这样翻译数字序列1,2,3,4:

00000001 00000010 00000011 00000100 
     

我们的数据现已翻译成二进制文件,现在可以保存到   磁盘。

     

现在一起

     

假设某个应用程序从磁盘中读取以下内容:

1101000 1100101 1101100 1101100 1101111 
     

应用程序知道此数据代表用其编码的Unicode字符串   UTF-8并且必须将其显示为用户的文本。第一步,是   将二进制数据转换为数字。该应用程序使用UTF-8算法   解码数据。在这种情况下,解码器返回:

104 101 108 108 111 
     

由于应用程序知道这是一个Unicode字符串,因此可以假定每个字符串   数字代表一个角色。我们使用Unicode字符集   将每个数字转换为相应的字符。所结果的   string是“你好”。

     

结论

     

所以当有人问你“UTF-8和UTF-8之间有什么区别?   Unicode?“,您现在可以自信地回答短而精确的问题:

     

UTF-8(Unicode转换格式)和Unicode无法进行比较。 UTF-8是一种编码   用于将数字转换为二进制数据。 Unicode是一个字符集   用于将字符翻译成数字。

答案 1 :(得分:156)

  

大多数编辑器支持实际保存为“Unicode”编码。

这是Windows不幸发生的错误行为。

由于Windows在内部使用UTF-16LE编码作为Unicode字符串的内存存储格式,因此它认为这是Unicode文本的自然编码。在Windows世界中,有ANSI字符串(当前机器上的系统代码页,完全不可移植),并且有Unicode字符串(内部存储为UTF-16LE)。

在我们意识到UCS-2还不够之前以及UTF-8发明之前,这一切都是在Unicode早期设计的。这就是为什么Windows对UTF-8的支持是全面的。

这种误导的命名方案成为用户界面的一部分。使用Windows编码支持提供一系列编码的文本编辑器将自动且不恰当地将UTF-16LE描述为“Unicode”,并将UTF-16BE(如果提供)描述为“Unicode big-endian”。

(编写自己的其他编辑器,如Notepad ++,没有这个问题。)

如果它让你感觉更好,'ANSI'字符串也不是基于任何ANSI标准。

答案 2 :(得分:28)

这不是那么简单。

UTF-16是一种16位可变宽度编码。简单地称“Unicode”是不明确的,因为“Unicode”指的是用于字符编码的整套标准。 Unicode 是一种编码!

http://en.wikipedia.org/wiki/Unicode#Unicode_Transformation_Format_and_Universal_Character_Set

当然还有强制性的Joel On Software - The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)链接。

答案 3 :(得分:15)

这里显示了很多误解。 Unicode不是 编码,但Unicode标准主要用于编码。

ISO 10646是您(可能)关心的国际字符集。它定义了一组命名字符(例如,“Latin Capital Letter A”或“Greek small letter alpha”)和一组代码点(分配给每个代码点的数字)之间的映射 - 例如,61十六进制和3B1十六进制那两个;对于Unicode代码点,标准符号将是U + 0061和U + 03B1)。

有一次,Unicode定义了自己的字符集,或多或少地作为ISO 10646的竞争对手。这是一个16位字符集,但它不是 UTF-16;它被称为UCS-2。它包含了一个颇具争议的技巧,试图将必要角色的数量保持在最低限度(汉族统一 - 基本上将中文,日文和韩文字符视为同一个角色,非常相似)。

从那以后,Unicode联盟默认了这不起作用,现在主要集中在编码ISO 10646字符集的方法上。主要方法是UTF-8,UTF-16和UCS-4(又名UTF-32)。那些(UTF-8除外)也有LE(小端)和BE(大端)变体。

本身,“Unicode”几乎可以指任何上述内容(尽管我们可以消除它明确显示的其他内容,例如UTF-8)。无限制地使用“Unicode”可能最常发生在Windows上,几乎可以肯定地引用UTF-16。当UCS-2是最新的时,早期版本的Windows NT采用Unicode。在宣布UCS-2过时后(在Win2k附近,如果内存服务),他们切换到UTF-16,这与UCS-2最相似(事实上,它对于“基本多语言平面”中的字符是相同的,其涵盖很多,包括大多数西欧语言的所有角色。)

答案 4 :(得分:7)

UTF-16和UTF-8都是Unicode的编码。它们都是 Unicode;一个不是更多 Unicode而不是另一个。

不要让微软的一件不幸的历史文物让你感到困惑。

答案 5 :(得分:4)

  

目标是开发Unicode   为映射创建新标准   绝大多数的人物   今天使用的语言,   以及其他角色   不是那么重要但可能是   创建文本所必需的。 UTF-8   只是你的众多方式之一   可以编码文件,因为有   你可以编码的很多方法   文件中的字符转换为Unicode。

来源:

http://www.differencebetween.net/technology/difference-between-unicode-and-utf-8/

答案 6 :(得分:3)

除了Trufa的评论,Unicode明确不是UTF-16。当他们第一次看到Unicode时,推测16位整数可能足以存储任何代码,但实际上并非如此。但是,UTF-16是另一种有效的Unicode编码 - 与8位和32位变体一样 - 我相信是微软在NT衍生操作系统上运行时在内存中使用的编码。

答案 7 :(得分:2)

让我们从记住数据存储为字节开始; Unicode是一个字符集,其中字符映射到代码点(唯一整数),我们需要一些东西将这些代码点数据转换为字节。这就是UTF-8所谓的编码 - 简单!

答案 8 :(得分:1)

这很奇怪。 Unicode是标准,而不是编码。由于可以指定字节序,我猜它实际上是UTF-16或32。

此菜单从哪里提供?