假设你有一个这样的字符串:
unicodes = ["\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d"]我想把每个unicode分别放到一个数组中。
所以看起来像这个["\ua7a8","\ua7a9","\ud800\udf30"]
我试过的是:
unicodes = ["\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d"]
var collectedUnicodes = []
for (let i=0; i < unicodes.length; i++) {
collectedUnicodes = collectedUnicodes.concat(unicodes[i].split(""))
}
console.log(collectedUnicodes)返回以下内容:
['Ꞩ', 'ꞩ', '\uD800', '\uDF30', '\uD800', '\uDF31', '\uD800', '\uDF32', '\uD800', '\uDF33', '\uD800', '\uDF34', '\uD800', '\uDF35', '\uD800', '\uDF36', '\uD800', '\uDF37', '\uD800', '\uDF38', '\uD800', '\uDF39', '\uD800', '\uDF3A', '\uD800', '\uDF3B', '\uD800', '\uDF3C', '\uD800', '\uDF3D']问题是它摧毁了那些长度超过4位数的独角兽。他们被分成两个\u。
因为\uD800和\uDF37一起是一个Unicode。我想要实现它,gtes把它放在一个数组元素中。而且可能会有像这样分开的独角兽,这可能是从\uF而不是\uD开始的。
做这件事的正确方法是什么?
发布于 2022-10-25 14:40:50
您可以使用.codePointAt()在给定位置生成Unicode代码点,使用.toString(16)获取十六进制表示,或者使用扩展运算符([...input])或for+of循环以完全独立于Unicode的方式分割单个字符:
const input = "\ua7a8\ua7a9\ud800\udf30\ud800\udf31\ud800\udf32\ud800\udf33\ud800\udf34\ud800\udf35\ud800\udf36\ud800\udf37\ud800\udf38\ud800\udf39\ud800\udf3a\ud800\udf3b\ud800\udf3c\ud800\udf3d";
let output = [];
for (const character of input) {
output.push("U+" + character.codePointAt(0).toString(16).toUpperCase());
}
console.log(input, output.join(''));
参考编码。
(您可能不需要代理数组,我没有深入研究)。
https://stackoverflow.com/questions/74195471
复制相似问题