gpt4 book ai didi

带有 utf-16 代理项对的 javascript 和字符串操作

转载 作者:可可西里 更新时间:2023-11-01 01:21:11 24 4
gpt4 key购买 nike

我正在开发一个 Twitter 应用程序,并且偶然发现了 utf-8(16) 的世界。似乎大多数 javascript 字符串函数都像我一样对代理对视而不见。我必须重新编码一些内容以使其具有广泛的字符意识。

我有这个函数可以在保留代理项对的同时将字符串解析为数组。然后我将重新编写几个函数来处理数组而不是字符串。

function sortSurrogates(str){
var cp = []; // array to hold code points
while(str.length){ // loop till we've done the whole string
if(/[\uD800-\uDFFF]/.test(str.substr(0,1))){ // test the first character
// High surrogate found low surrogate follows
cp.push(str.substr(0,2)); // push the two onto array
str = str.substr(2); // clip the two off the string
}else{ // else BMP code point
cp.push(str.substr(0,1)); // push one onto array
str = str.substr(1); // clip one from string
}
} // loop
return cp; // return the array
}

我的问题是,我是否遗漏了一些更简单的东西?我看到很多人重申 javascript native 处理 utf-16,但我的测试让我相信,这可能是数据格式,但函数还不知道。我错过了一些简单的东西吗?

编辑:为了帮助说明问题:

var a = "0123456789"; // U+0030 - U+0039 2 bytes each
var b = "𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡"; // U+1D7D8 - U+1D7E1 4 bytes each
alert(a.length); // javascript shows 10
alert(b.length); // javascript shows 20

Twitter 将这两者视为 10 个字符长。

最佳答案

Javascript 在内部使用 UCS-2,而不是 UTF-16。因此,在 Javascript 中处理 Unicode 非常困难,我不建议尝试这样做。

至于 Twitter 的作用,您似乎是在说它是按代码点而不是按代码单元进行疯狂计数。

除非您别无选择,否则您应该使用一种真正支持 Unicode 的编程语言,并且它具有代码点接口(interface),而不是代码单元接口(interface)。正如您所发现的那样,Javascript 不够好。

它有 UCS-2 Curse, 甚至比 UTF-16 Curse, 已经够糟糕了。我在 OSCON 谈话中谈到了所有这些,🔫 Unicode Support Shootout: 👍 The Good, the Bad, & the (mostly) Ugly 👎 .

由于其可怕的 Curse,您必须在 Javascript 中使用 UCS-2 手动模拟 UTF-16,这简直是疯了。

Javascript 也遭受着各种其他可怕的 Unicode 问题。它不支持字素、规范化或排序规则,而这些都是您真正需要的。它的正则表达式被破坏了,有时是由于诅咒,有时只是因为人们弄错了。例如,Javascript 无法表达像 [𝒜-𝒵] 这样的正则表达式。 Javascript 甚至不支持 casefolding,因此您无法编写类似 /ΣΤΙΓΜΑΣ/i 的模式并使其正确匹配 στιγμας

你可以尝试使用the XRegEXp plugin ,但你不会以这种方式消除诅咒。只有更改为支持 Unicode 的语言才能做到这一点,而 𝒥𝒶𝓋𝒶𝓈𝒸𝓇𝒾𝓅𝓉 不是其中之一。

关于带有 utf-16 代理项对的 javascript 和字符串操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6885879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com