V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Windsooon
V2EX  ›  程序员

我们有多不理解字符串编码

  •  
  •   Windsooon ·
    Windsooon · 2018-05-11 14:10:12 +08:00 · 2178 次点击
    这是一个创建于 2176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前写过一篇文章一文理解字符串编码,有读者发邮件给我说某个地方出错了,我检查并且修改了之后,同时也发现了国内转换工具的字符串转 UTF-8 的错误。

    字符串转 UTF-8

    “你”的 Unicode 编码是 U+4f60,经过转换规则转换成 UTF-8 应该是三个字节 e4bda0,你可以通过 python3 进行验证:

    '>>> '你'.encode('utf-8')
    b'\xe4\xbd\xa0'
    

    不过我发现大部分的中文在线转换网站(我选择搜索引擎的前 10 位)无一例外显示的转换结果都是&#x4F60,这是“你“的 Html 实体编码,转换方式是&#x 加上“你”的 Unicode 编码,根本不是它的 UTF-8 编码。这些转换工具都把这个混淆了。相反,用英文搜索得到的转换网站都能给出正确的结果。好吧,我知道为什么大部分人不了解字符串编码了,Doge。

    example example2

    4 条回复    2018-05-12 01:56:44 +08:00
    ysc3839
        1
    ysc3839  
       2018-05-11 14:23:38 +08:00
    大概是因为这类转换网站的主要目的是赚广告费?所以就直接抄别的网站了。
    wssgcg1213
        2
    wssgcg1213  
       2018-05-11 22:34:14 +08:00 via iPhone
    你是有多不理解 unicode ?

    unicode 只描述了一套码点,标准中还有标准平面和扩展平面之分,但是每一个字符只对应一个码点。

    utf8 描述的是存储码点使用的编码格式,是一种可变长度的编码格式,描述的方法具体可以参考 wiki。

    所以你例子里面的 utf8 没错,unicode 是 0x4f60 也没错
    wssgcg1213
        3
    wssgcg1213  
       2018-05-11 22:35:33 +08:00 via iPhone
    @wssgcg1213 好吧我看岔了
    Windsooon
        4
    Windsooon  
    OP
       2018-05-12 01:56:44 +08:00 via iPhone
    @wssgcg1213 我不确定我理解你的意思,utf8 是 unicode 的存储实现,“你”的 unicode 编码是两个字节的 4f60,它对应的 utf-8 是经过规则转换的 e4bda0。不会还是 4f60。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1047 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:12 · PVG 06:12 · LAX 15:12 · JFK 18:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.