【问题标题】:why is unicode value different for symbol '????' in nodejs and python?为什么符号'????'的unicode值不同在nodejs和python中?
【发布时间】:2019-03-25 09:16:16
【问题描述】:

为什么符号 '????' 的 unicode 值在 nodejs 和 python 中是不同的。

nodejs (8.11 版) 给出 "????".charCodeAt(0) 输出为 55357

其中作为 python(2.7 或 3.6 版) ord('????'[0]) 输出为 128515

根据https://www.fileformat.info/info/unicode/char/1f603/index.htm 128515 是正确的。 那么为什么 nodejs 给出不同的数字呢?

【问题讨论】:

    标签: python node.js unicode


    【解决方案1】:

    因为 JavaScript 没有实现正确的 Unicode 编码(寻址 1114112 个代码点),而是 UCS-2(仅寻址 65536)。所谓的星体字符在 JavaScript 中被编码为两个 UCS-2 字符;你的charCodeAt(0) 只显示你其中的第一个。

    JavaScript 中有一个新函数可以解决这个问题:

    console.log("?".codePointAt(0))

    MDN 有一个polyfill,您可以在其中学习翻译背后的数学知识。

    【讨论】:

    • 从技术上讲,它不再是 UCS-2,而是 UTF-16,因为它包含代理字符。
    • @DanielPryden:这是一个视角问题。底层数据被编码为 UTF-16;但 JavaScript 将其视为 UCS-2(忽略代理字符的语义),但在显示时和 codePointAt 中除外。区别与 ASCII-8bit 与 UTF-8 相同:"\xF0\x9F\x98\x83" 在技术上与"?"(UTF-8 编码)相同,但我看到的只是四个字节。
    • 我猜?关键是,表情符号和 BMP 之外的其他字符无法在 UCS-2 中表示。 UCS-2 作为一种编码格式早于它们的存在,并且无法进行改造以包含它们。创建 UTF-16 以取代 UCS-2; UTF-16 可以通过使用代理来包含来自其他平面的字符。如果你有一个包含代理字符的字符串,我会称之为 UTF-16 而不是 UCS-2。 JavaScript 的问题是许多 API 函数(包括 codePointAt,不幸的是)还没有升级到理解 UTF-16,并且不能不改变字符的索引方式。
    • @DanielPryden:你误解了我的意思。 "?" 无疑被编码为 UTF-16。但是 JavaScript 把它 当作 UCS-2,因为它从来没有正确理解 UTF-16(直到最近,codePointAt)。代理字符在那里,但 JavaScript 不理解它们。如果是,"?"[0] == "?";但是在 Ruby 中是 true,在 JavaScript 中是 false。如果 JavaScript 使用 UTF-16,"?".length 将是 1,就像在 Ruby 中一样,而不是 2。它是 2,因为对于 JavaScript,"?" 是两个不相关的 UCS-2 字符,它们在显示时间。
    猜你喜欢
    • 2012-02-02
    • 2013-01-05
    • 2015-04-10
    • 1970-01-01
    • 2011-11-01
    • 2015-09-19
    • 2019-03-16
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多