Unicode和UTF-8有什么区别?
考虑:
unicode=utf16
是真的吗?
许多人认为Unicode是一种标准,而不是一种编码,但大多数编辑器实际上支持保存为Unicode 编码 。
大多数编辑者实际上都支持保存为“Unicode”编码。
这是Windows所犯的一个不幸的错误。
由于Windows内部使用UTF-16LE编码作为Unicodestring的内存存储格式,因此它认为这是Unicode文本的自然编码。 在Windows世界中,有ANSIstring(当前机器上的系统代码页,总的不可移植性),并且有Unicodestring(内部存储为UTF-16LE)。
这一切都是在Unicode早期devise的,然后才意识到UCS-2还不够,在UTF-8发明之前。 这就是为什么Windows对UTF-8的支持全面欠佳的原因。
这个错误的命名scheme成为用户界面的一部分。 使用Windows编码支持提供一系列编码的文本编辑器会自动将UTF-16LE描述为“Unicode”,如果提供UTF-16BE,则会自动将其描述为“Unicode big-endian”。
(自己编码的其他编辑器,如Notepad ++,没有这个问题。)
如果它让你感觉好一点,那么'ANSI'string也不是以任何ANSI标准为基础的。
正如Rasmus在他的文章“UTF-8和Unicode之间的区别? (链接固定):
如果问到“UTF-8和Unicode有什么区别?”,你会自信地回答一个简短而精确的答案吗? 在这些国际化的日子里,所有的开发者都应该能够做到这一点。 我怀疑我们很多人不理解这些概念,也不应该这样理解。 如果你觉得你属于这个组,你应该阅读这个超简短的字符集和编码介绍。
实际上,比较UTF-8和Unicode就像比较苹果和橙子:
UTF-8是一种编码 – Unicode是一个字符集
字符集是具有唯一编号的字符列表(这些编号有时称为“编码点”)。 例如,在Unicode字符集中, A的编号是41。
另一方面,编码是一种将数字列表转换为二进制的algorithm,以便将其存储在磁盘上。 例如,UTF-8会像这样翻译数字序列1,2,3,4:
00000001 00000010 00000011 00000100
我们的数据现在被翻译成二进制,现在可以保存到磁盘。
现在都在一起了
假定应用程序从磁盘读取以下内容:
1101000 1100101 1101100 1101100 1101111
该应用程序知道这些数据表示用UTF-8编码的Unicodestring,并且必须以文本的forms显示给用户。 第一步,是将二进制数据转换为数字。 该应用程序使用UTF-8algorithm来解码数据。 在这种情况下,解码器返回这个:
104 101 108 108 111
由于应用程序知道这是一个Unicodestring,它可以假设每个数字代表一个字符。 我们使用Unicode字符集将每个数字转换为相应的字符。 结果string是“你好”。
结论
所以当有人问你“UTF-8和Unicode有什么区别?”时,你现在可以自信地回答简短和精确:
UTF-8和Unicode不能比较。 UTF-8是一种用于将数字转换为二进制数据的编码。 Unicode是用于将字符转换为数字的字符集。
这并不简单。
UTF-16是一个16位,可变宽度的编码。 简单地调用“Unicode”是不明确的,因为“Unicode”是指字符编码的一整套标准 。 Unicode 不是编码!
http://en.wikipedia.org/wiki/Unicode#Unicode_Transformation_Format_and_Universal_Character_Set
当然,强制Joel On软件 – 绝对最小每个软件开发人员绝对,积极必须知道Unicode和字符集(无借口!)链接。
这里显示了很多误解。 Unicode不是一种编码,但Unicode标准主要用于编码。
ISO 10646是您可能关心的国际字符集。 它定义了一组命名字符(例如,“拉丁大写字母A”或“希腊小写字母”)与一组代码点(每个代码分配一个数字 – 例如61个hex数和3B1hex数这两个分别对应于Unicode代码点,标准符号为U + 0061和U + 03B1)。
有一次,Unicode定义了自己的字符集,或多或less地作为ISO 10646的竞争者。这是一个16位字符集,但它不是 UTF-16; 它被称为UCS-2。 其中包括一个颇有争议的技巧,试图将必要的字符数量降到最低(汉字统一 – 基本上把中国,日本和韩国的字符看作是相同的字符)。
从那时起,Unicode联盟就默认了这样做,但是现在还不行,现在主要集中在编码ISO 10646字符集的方法上。 主要的方法是UTF-8,UTF-16和UCS-4(又名UTF-32)。 那些(UTF-8除外)也有LE(小端)和BE(大端)变种。
就其本身而言,“Unicode”几乎可以指代以上任何一种(尽pipe我们可以排除其他显式的,如UTF-8)。 “Unicode”的不合格使用可能发生在Windows上最常见的地方,它几乎肯定会涉及到UTF-16。 当UCS-2是最新版本的Windows NT的早期版本采用Unicode。 在UCS-2宣布已经过时(在Win2k之前,如果有内存服务的话),他们切换到与UCS-2最相似的UTF-16(实际上,“基本多语言平面”中的字符是相同的很多,包括大多数西欧语言的所有字符)。
UTF-16和UTF-8都是Unicode的编码。 它们都是Unicode的; 一个不是比另一个更 Unicode。
不要让一个来自微软的不幸的历史神器混淆你。
Unicode的发展旨在创build一个新的标准,用于映射当前正在使用的绝大多数语言中的字符以及其他字符,这些字符不是必需的,但可能是创build文本所必需的。 UTF-8只是可以对文件进行编码的许多方法之一,因为有很多方法可以将文件中的字符编码为Unicode。
资源:
http://www.differencebetween.net/technology/difference-between-unicode-and-utf-8/
除了Trufa的评论之外,Unicode明确地不是UTF-16。 当他们第一次查看Unicode时,推测16位整数可能足以存储任何代码,但实际上并非如此。 但是,UTF-16是Unicode的另一个有效编码 – 除了8位和32位变体外 – 我相信这是Microsoft在NT衍生操作系统上运行时在内存中使用的编码。
有点奇怪。 Unicode是一个标准,而不是一个编码。 因为可以指定字节序我猜是有效的UTF-16或32。
这个菜单从哪里提供?
让我们从记住数据存储为字节开始, Unicode是字符集映射到代码点(唯一整数)的字符集,我们需要将这些代码点数据转换为字节。 这就是UTF-8所谓的编码 – 简单!