Unicode和UTF-8有什么区别?

oll*_*dbg 195 unicode utf-8

考虑:

替代文字

这是真的unicode=utf16吗?

许多人说Unicode是标准,而不是编码,但大多数编辑器实际上支持另存为Unicode 编码.

vik*_*vde 576

正如Rasmus在他的文章"UTF-8和Unicode之间的区别?"中所述.(链接修复):

如果问到"UTF-8和Unicode之间有什么区别?"这个问题,你会自信地回复一个简短而准确的答案吗?在国际化的这些日子里,所有开发人员都应该能够做到这一点.我怀疑我们很多人不应该理解这些概念.如果您认为自己属于这个群体,那么您应该阅读这个对字符集和编码的简短介绍.

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

UTF-8是一种编码 - Unicode是一种字符集

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

另一方面,编码是一种将数字列表转换为二进制的算法,因此可以将其存储在磁盘上.例如,UTF-8会像这样翻译数字序列1,2,3,4:

00000001 00000010 00000011 00000100 
Run Code Online (Sandbox Code Playgroud)

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

现在都在一起了

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

1101000 1100101 1101100 1101100 1101111 
Run Code Online (Sandbox Code Playgroud)

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

104 101 108 108 111 
Run Code Online (Sandbox Code Playgroud)

由于应用程序知道这是一个Unicode字符串,因此它可以假设每个数字代表一个字符.我们使用Unicode字符集将每个数字转换为相应的字符.结果字符串是"hello".

结论

所以当有人问你"UTF-8和Unicode有什么区别?"时,你现在可以自信地回答简短而准确的问题:

无法比较UTF-8(Unicode转换格式)和Unicode.UTF-8是用于将数字转换为二进制数据的编码.Unicode是用于将字符转换为数字的字符集.

  • 这是完全正确的,并回答了标题中提出的问题.它确实*但不回答实际问题,这是基于微软使用`Unicode`来引用`UTF-16`的错误陈述. (4认同)
  • 对不起,但我根本没有遵循,“它使用 utf8 算法来解码二进制文件”什么?二进制是二进制它只需要数学转换回十进制。如果您告诉我decimal(41) 是unicode 中的A,那么我不需要其他任何东西来将它存储为二进制并将其取回。 (3认同)
  • UTF-8 不仅是一种编码,也是一种字符集。或者更准确地说,UTF-8 *使用 Unicode 作为其字符集*。我的意思是你不能将它用作另一个字符集的编码。 (3认同)
  • @sliders_alpha“二进制是二进制,只需要将数学转换回十进制即可”-错误,非常错误。我们这里不是在讨论数字基础,而是在讨论“编码方案”。UTF-8不仅将十进制数转换为二进制数,还比这复杂得多。这个答案给出的例子很差,因为它使用数字1、2、3和4,它们恰好被编码为它们的二进制表示形式,但是通常情况并非如此。特别是对于在编码中使用非平凡的位偏移量的UTF-8。我建议您阅读有关UTF-8编码算法的Wiki文章 (3认同)
  • UTF-8编码根据每个字符动态分配位.而unicode每个字符使用32位.这个答案示例仅使用7位ASCII字符,这就是为什么易于理解和满足大多数读者,但UTF-8并不那么容易.如果您还放置一些多字节示例,那将会很好. (2认同)

bob*_*nce 166

大多数编辑器支持实际保存为"Unicode"编码.

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

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

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

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

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

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


Mat*_*all 29

这不是那么简单.

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

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

当然,强制性的Joel On Software - 绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)链接.


Jer*_*fin 16

这里显示了很多误解.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最相似(事实上,它与"基本多语言平面"中的字符完全相同,其中包括很多,包括大多数西欧语言的所有角色).

  • @GregS:关于我所能说的只是.NET的粉丝无疑会将我对.NET设计的诚实看法标记为攻击性(事实上,尽管我已经对它进行了很多调整,但这已经发生了). (7认同)

Mar*_*som 9

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

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


Tru*_*ufa 6

Unicode 的开发旨在创建一个新标准,用于映射当今使用的绝大多数语言中的字符,以及其他不那么重要但可能是创建文本所必需的字符。UTF-8 只是您可以对文件进行编码的众多方式之一,因为您可以通过多种方式将文件中的字符编码为 Unicode。

来源:

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