RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 575494
Accepted
MaximPro
MaximPro
Asked:2020-10-09 16:39:29 +0000 UTC2020-10-09 16:39:29 +0000 UTC 2020-10-09 16:39:29 +0000 UTC

什么是 Unicode 以及 UTF-8 与它有何关系

  • 772

我熟悉了有关 Unicode 的维基百科页面,但不理解它,尽管它在那里说这是一个字符编码标准

据我所知,Unicode表示如下

0x00000000 - 0x0010F800

有一种说法是UTF-16 = Unicode,是真的吗?

UTF-16 表示为 256*256 = 65 536(没有代理对),有代理对的公式是 2^20+2^16−2048 - 不清楚这样的公式是怎么来的,懂行的可以解释一下(没有代理对,一切都很清楚)

UTF-8表示如下

4字节(用什么)

0x00000000 - 0x001FFFFF

6 个字节(未使用的)

0x00000000 - 0x7FFFFFFF

这里问题似乎在酝酿,如果 Unicode 编码的字符少 2 倍,我们如何从 UTF-8 转换为 Unicode?

什么是 Unicode,为什么我们要从同一个 UTF-8 翻译成它?

PS 脑子里的粥,我已经糊涂了X_X,帮我理清头绪

unicode
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    andreymal
    2020-10-10T17:57:48Z2020-10-10T17:57:48Z

    总结评论和聊天中写的内容。注意:这个答案并不假装是一个严格的规范,而是一个“在手指上”的解释,以提高理解,可能包含不准确之处,对于程序开发,最好不要阅读 SO 甚至维基百科,而是阅读标准本身。

    在问题的上下文中,Unicode只是一个字符表和分配给它们的整数(不是任何字节,而是普通的人类数字)。(并且 Unicode 还描述了字符的处理以及它们之间的相互转换,但问题不在于此。)

    这块牌匾的一块:

    Unicode 中的西里尔字母

    此表并未准确说明这些数字如何转换为可存储在计算机中的字节。但是为了在计算机中存储 unicode,毕竟必须有人指定如何翻译它们!


    让我们从这个字符表中取出数字并将它们填充到四个字节中,以便四个字节代表一个无符号整数(unsigned int,uint32)。也就是说,例如,从字母“I”的代码 42F 16我们得到 bytes 00 00 04 2F。这样,我们就得到了最简单的UTF-32编码(UTF-32-BE 1 , UCS-4)。如果我们将接收到的这四个字节解释为一个无符号整数,那么我们就得到了 Unicode 盘中的字符编号。

    通过澄清我们使用的是 uint32,我们可以假设UTF-32 = Unicode:每个数字都按原样编码解码,没有任何转换。


    如果我们从表中取出数字并将它们塞入表示无符号整数(unsigned short,uint16)的两个字节中,那么我们将获得Unicode 的第一个版本,它是在 1991 年。然后字符数被限制在65536个,他们所有的代码都可以很容易地用两个字节表示,不需要额外的转换。

    但后来他们认为 65,000 是不够的,并将最大字符数增加到 100 万。但毕竟不能把一百万塞进两个字节,每个字符需要占用更多的字节。但是由于已经出现了依赖这两个字节的程序(例如,在 Java 或 Windows NT 中,一个字符的长度仍然是 2 个字节),那么为了至少保持一定的向后兼容性,D800 16范围是撕掉这两个字节. .DFFF 16并表示这些是代理项对,占用四个字节,并根据代码为 10000 16及以上字符的特殊算法进行处理。他们称其为UTF-16 编码。

    因此,在 UTF-16 中,Unicode 表中落在 0000 16 ..D7FF 16和 E000 16 ..FFFF 16范围内的数字按原样写为两个字节,代码为 10000 16和更大的字符写为代理项与使用范围 D800 16 ..DFFF 16配对并占用四个字节。因此,如果不使用代理对,为 Unicode 的第一个两字节版本制作的旧应用程序可以继续使用它。

    于是,同一个字母“I”(代码42F 16)在UTF-16(UTF-16-BE)中表示为04 2F,代码1F512 16不适合两个字节的字符“🔒”被转换根据算法分成四个字节D8 3D DD 12。

    因为这些非常代理对与一堆UTF-16 ≠ Unicode转换。


    UTF-8是为了与 ASCII 兼容而设计的:在其中,从 0 到 7F 16的字符代码按原样写入一个字节,最终给出相同的 ASCII,而其他所有内容都使用比 UTF-16 更棘手的算法进行编码, 所以UTF-8 ≠ Unicode也是。

    从技术上讲,UTF-8 最多允许编码 20 亿个数字,但 Unicode 限制为一百万个字符,并且标准规定禁止使用 UTF-8 对不在 Unicode 允许范围内的数字进行编码。因此,将非 Unicode 数字从 UTF-8 转换为 Unicode 根本没有问题:在这种情况下,制作精良的应用程序会抛出错误或将所有无效内容替换为 � 字符。


    在 Notepad 和 Notepad++ 中,您可以看到名为“Unicode”的编码,但它实际上是 UTF-16-LE with BOM 1。

    (点击放大)


    最常见的编码似乎是 UTF-8。


    1 - 占用超过一个字节的数字可以用不同的字节顺序书写:例如,数字 259 可以写成01 03(大端,BE)或03 01(小端,LE)。这同样适用于 UTF-16、UTF-32 和一些其他编码(但不是 UTF-8)中的字符。上面的 🔒 在 UTF-16-LE 中编码为3D D8 12 DD- 而在 UTF-16-BE 中它将是D8 3D DD 12. BOM 是文本开头的一个特殊的 FEFF 16字符,它允许您确定相同的字节顺序 - 在大端中它写为FE FF,在小端中写为 ,并且禁止FF FE使用 FFFE 16字符,这允许你来确定字节顺序。

    • 21

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5