string - 将 utf-8 编码的字符串从字节转换为字符时,计算机如何知道字符在哪里结束?

标签 string unicode utf-8 character-encoding

给定一个以 UTF-8 编码的 Unicode 字符串,它只是内存中的字节。

如果计算机想要将这些字节转换为其相应的 Unicode 代码点(数字),它如何知道一个字符在哪里结束而另一个字符从哪里开始?一些字符由 1 个字节表示,其他字符最多由 6 个字节表示。所以如果你有

00111101 10111001

这可以表示 2 个字符,或 1 个。计算机如何决定正确解释它?是否有某种约定可以让我们从第一个字节中知道当前字符使用了多少字节之类的?

最佳答案

多字节序列的第一个字节以前导 1 位的数量对序列的长度进行编码:

  • 0xxxxxxx本身就是一个角色;
  • 10xxxxxx是多字节字符的延续;
  • 110xxxxx是 2 字节字符的第一个字节;
  • 1110xxxx是 3 字节字符的第一个字节;
  • 11110xxx是 4 字节字符的第一个字节。

  • 超过 4 个前导 1 位的字节不会在 UTF-8 中编码有效字符,因为 4 字节序列已经涵盖了从 U+0000 到 U+10FFFF 的整个 Unicode 范围。

    因此,问题中提出的示例有一个 ASCII 字符和一个不单独对字符进行编码的连续字节。

    关于string - 将 utf-8 编码的字符串从字节转换为字符时,计算机如何知道字符在哪里结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15688569/

    相关文章:

    javascript - 在 JavaScript 中通过正则表达式拆分字符串

    string - 在 Swift String 中查找字符索引

    unicode - 在 Elixir 中计算字符串中的代码点

    css - 在哪里可以找到数据图标 unicode 值

    perl - 如何从 Perl 输出 UTF-8?

    C# 与 MySql 和 Unicode 字符

    mysql - 将 MySQL latin1_swedish_ci 转换为 utf8_unicode_ci 时丢失数据

    c++ - c++中字符串类对象的+运算符和附加函数之间的区别?

    ruby - 在 ruby​​ 中组合符号

    ruby-on-rails - Rails/Ruby 1.9 : Is there a better way to put Unicode in source files than sticking # encoding at the top of every file