首页 文章

UTF-8,UTF-16和UTF-32

提问于
浏览
389

UTF-8,UTF-16和UTF-32有什么区别?

我知道他们都将存储Unicode,并且每个都使用不同的字节数来表示字符 . 选择一个优于另一个是否有优势?

12 回答

  • 294

    UTF-8在ASCII字符代表文本块中的大多数字符的情况下具有优势,因为UTF-8将所有字符编码为8位(如ASCII) . 还有利的是,仅包含ASCII字符的UTF-8文件具有与ASCII文件相同的编码 .

    UTF-16在ASCII不占优势的地方更好,因为它主要使用每个字符2个字节 . 对于高阶字符,UTF-8将开始使用3个或更多字节,对于大多数字符,UTF-16仅保留2个字节 .

    UTF-32将覆盖4个字节中的所有可能字符 . 这让它变得非常臃肿 . 我想不出使用它有什么好处 .

  • 20

    简而言之:

    • UTF-8:可变宽度编码,向后兼容ASCII . ASCII字符(U 0000至U 007F)取1个字节,代码点U 0080至U 07FF取2个字节,代码点U 0800至U FFFF取3个字节,代码点U 10000至U 10FFFF取4个字节 . 适合英文文本,不太适合亚洲文字 .

    • UTF-16:可变宽度编码 . 代码点U 0000到U FFFF需要2个字节,代码点U 10000到U 10FFFF需要4个字节 . 英文文本不好,适合亚洲文字 .

    • UTF-32:固定宽度编码 . 所有代码点都占用四个字节 . 巨大的记忆力,但快速操作 . 很少用 .

    长:请参阅维基百科:UTF-8UTF-16UTF-32 .

  • 38
    • UTF-8是变量 1 to 4 个字节 .

    • UTF-16是变量 2 or 4 个字节 .

    • UTF-32是固定的 4 字节 .

  • 1

    Unicode定义了一个巨大的字符集,为每个图形符号分配一个唯一的整数值(这是一个主要的简化,实际上并不是真的,但它足够接近这个问题的目的) . UTF-8/16/32只是对此进行编码的不同方式 .

    简而言之,UTF-32为每个字符使用32位值 . 这允许他们为每个角色使用固定宽度的代码 .

    UTF-16默认使用16位,但这只能为您提供65k个可能的字符,这对于完整的Unicode集来说已经足够了 . 所以一些字符使用16位值对 .

    UTF-8默认使用8位值,这意味着127个第一个值是固定宽度的单字节字符(最高有效位用于表示这是多字节序列的开始,留下7个实际字符值的位) . 所有其他字符编码为最多4个字节的序列(如果存储器服务) .

    这导致了我们的优势 . 任何ASCII字符都与UTF-8直接兼容,因此对于升级旧版应用程序,UTF-8是一种常见且明显的选择 . 在几乎所有情况下,它也将使用最少的内存 . 另一方面,您无法保证角色的宽度 . 它可能是1,2,3或4个字符宽,这使得字符串操作变得困难 .

    UTF-32是相反的,它使用最多的内存(每个字符是固定的4字节宽),但另一方面,你知道每个字符都有这个精确的长度,因此字符串操作变得更加简单 . 您可以根据字符串的字节长度计算字符串中的字符数 . 你不能用UTF-8做到这一点 .

    UTF-16是一种妥协 . 它允许大多数字符符合固定宽度的16位值 . 所以,只要你不要避免困扰UTF-8(可变长度字符)的问题 .

    最后,与平台支持的内容一起使用通常很有帮助 . Windows在内部使用UTF-16,因此在Windows上,这是显而易见的选择 .

    Linux有所不同,但它们通常使用UTF-8来处理符合Unicode的所有内容 .

    如此简短的回答:所有三种编码都可以编码相同的字符集,但它们将每个字符表示为不同的字节序列 .

  • 2

    Unicode是一个标准,关于UTF-x,您可以将其视为一些实际用途的技术实现:

    • UTF-8 - “ size optimized ”:最适合基于拉丁字符的数据(或ASCII),每个字符只需1个字节,但大小相应增加符号种类(在最坏的情况下,每个字符最多可增加6个字节)

    • UTF-16 - “ balance ”:每个字符至少需要2个字节,足以满足现有主流语言的需要固定大小以便于字符处理(但是大小仍然是可变的,每个字符最多可以增加4个字节)

    • UTF-32 - “ performance ”:允许使用简单算法作为固定大小字符(4字节)的结果,但内存不利

  • 9

    我试着在我的blogpost中给出一个简单的解释 .

    UTF-32

    需要32位(4字节)来编码任何字符 . 例如,为了使用此方案表示"A"字符代码点,您需要以32位二进制数写入65:

    00000000 00000000 00000000 01000001 (Big Endian)
    

    如果仔细观察一下,你会发现使用ASCII方案时,最右边的7位实际上是相同的位 . 但由于UTF-32是固定宽度方案,我们必须附加三个额外的字节 . 这意味着如果我们有两个只包含"A"字符的文件,一个是ASCII编码的,另一个是UTF-32编码的,它们的大小将相应地为1个字节和4个字节 .

    UTF-16

    许多人认为,由于UTF-32使用固定宽度32位来表示代码点,因此UTF-16的固定宽度为16位 . 错误!

    在UTF-16中,代码点可以用16位或32位表示 . 所以这个方案是可变长度编码系统 . 与UTF-32相比有什么优势?至少对于ASCII,文件的大小不会是原始文件的4倍(但仍然是两倍),因此我们仍然不能向后兼容ASCII .

    由于7位足以表示“A”字符,因此我们现在可以使用2个字节而不是像UTF-32那样的4个字节 . 它看起来像:

    00000000 01000001
    

    UTF-8

    你猜对了..在UTF-8中,代码点可以用32,16,24或8位表示,而作为UTF-16系统,这个也是可变长度编码系统 .

    最后,我们可以用与ASCII编码系统相同的方式表示“A”:

    01001101
    

    一个小例子,其中UTF-16实际上优于UTF-8:

    考虑中文字母“语” - 其UTF-8编码为:

    11101000 10101010 10011110
    

    虽然它的UTF-16编码更短:

    10001010 10011110
    

    为了理解表示及其解释方式,请访问原始帖子 .

  • 98

    UTF-8

    • 没有字节顺序的概念

    • 每个字符使用1到4个字节

    • ASCII是兼容的编码子集

    • 完全自我同步,例如从流中的任何位置删除的字节最多只会破坏一个字符

    • 几乎所有欧洲语言都以每个字符两个字节或更少的字节编码

    UTF-16

    必须使用已知的字节顺序解析

    • 或读取字节顺序标记(BOM)

    • 每个字符使用2或4个字节

    UTF-32

    • 每个字符都是4个字节
      必须使用已知的字节顺序解析
    • 或读取字节顺序标记(BOM)

    除非大部分字符来自CJK(中文,日文和韩文)字符空间,否则UTF-8将是最节省空间的 .

    UTF-32最适合通过字符偏移随机访问字节数组 .

  • 70

    我做了一些测试来比较MySQL中UTF-8和UTF-16之间的数据库性能 .

    更新速度

    UTF-8

    Enter image description here

    UTF-16

    Enter image description here

    插入速度

    Enter image description here

    Enter image description here

    删除速度

    Enter image description here

    Enter image description here

  • 17

    在UTF-32中,所有字符都用32位编码 . 优点是您可以轻松计算字符串的长度 . 缺点是对于每个ASCII字符,您浪费了额外的三个字节 .

    在UTF-8字符具有可变长度时,ASCII字符以一个字节(八位)编码,大多数西方特殊字符以两个字节或三个字节编码(例如€是三个字节),并且更多奇特的字符可以占用到四个字节 . 明显的缺点是,先验你无法计算字符串的长度 . 但与UTF-32相比,编码拉丁(英语)字母文本所需的字节数要少得多 .

    UTF-16也是可变长度的 . 字符以两个字节或四个字节编码 . 我真的没有看到这一点 . 它具有可变长度的缺点,但没有像UTF-8那样节省空间的优点 .

    在这三个中,显然UTF-8是最广泛传播的 .

  • 13

    根据您的开发环境,您甚至可能无法选择内部使用的字符串数据类型的编码 .

    但是对于存储和交换数据,我总是使用UTF-8,如果你有选择的话 . 如果您主要拥有ASCII数据,这将为您提供最少量的数据传输,同时仍能进行编码一切 . 优化最少的I / O是现代机器的发展方向 .

  • 6

    如上所述,差异主要是底层变量的大小,在每种情况下变量都会变大以允许表示更多字符 .

    但是,字体,编码和事物都很复杂(不必要?),因此需要一个很大的链接来填充更多细节:

    http://www.cs.tut.fi/~jkorpela/chars.html#ascii

    不要指望理解这一切,但是如果你不想在以后遇到问题,那么尽可能多地学习,尽可能早(或者只是让其他人为你解决) .

    保罗 .

  • 266

    简而言之,使用UTF-16或UTF-32的唯一原因是分别支持非英语和古代脚本 .

    我想知道为什么有人会选择非UTF-8编码,因为它显然更有效的网络/编程目的 .

    一个常见的误解 - 后缀数字并不表示其能力 . 它们都支持完整的Unicode,只是UTF-8可以用单个字节处理ASCII,因此对CPU和互联网来说效率更高/更不易损坏 .

    一些好的阅读:http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/10/which_utf_do_i_use.htmlhttp://utf8everywhere.org

相关问题