【问题标题】:unicode UTF-8, Decoding issueunicode UTF-8,解码问题
【发布时间】:2018-06-17 00:19:39
【问题描述】:

UTF-8 是可变长度编码。如果一个字符可以使用单个字节来表示,例如:A(英文字母 A),UTF-8 将使用单个字节对其进行编码。如果它需要两个字节,它将使用两个字节,依此类推。 现在考虑我编码 A (01000001) あ(11100011 10000001 10000010)。 这将作为连续空间存储在内存中:01000001 11100011 10000001 10000010。 我的问题是在解码时,编辑器如何知道第一个字节仅用于第一个字符,接下来的 3 个字节用于第二个字符?

** 它最终可能会解码 4 个字符,其中每个字节都被视为字符,我的意思是这里的区别在哪里。

【问题讨论】:

  • 你试过解码吗?你最后有 4 个字符吗?
  • 编码是以长度为前缀的,所以你知道每个序列有多长。例如。 1110xxxx 表示三个字节(三个“一”)。
  • @Kerrek SB 根据您的回答,前三个 1 构成长度符号。考虑 ???? (Unicode标量值:U+2070E),其二进制值为0010 0000 0111 0000 1110,这里不包含4个1。
  • @Anthony McGrath 我的编辑器或浏览器确实会打印出我存储的确切符号,但我想从理论上了解编辑器是如何进行解码的。
  • @user9185862 UTF-8 不直接使用 Unicode 代码点的二进制表示。字符的 UTF-8 表示????是F0 A0 9C 8E,或11110000 10100000 10011100 10001110。

标签: unicode encoding utf-8


【解决方案1】:

UTF-8 编码告诉程序每个编码代码点有多少字节。任何以0xxxxxxx 开头的字节都是从0 到127 的ASCII 字符。任何以10xxxxxx 开头的字节都是连续字节,并且只能出现在起始字节之后:110xxxxx、1110xxxx 或11110xxx 指定下一个字节,两个字节或三个字节分别是连续字节。

如果没有正确数量的连续字节,或者连续字节出现在错误的位置,则该字符串不是有效的 UTF-8。一些程序利用这一点来尝试自动检测编码。

【讨论】:

  • 我用可用的例子检查了它,您的声明与它们相符,谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 2019-10-30
  • 2013-03-26
相关资源
最近更新 更多