gpt4 book ai didi

javascript - 当非 ASCII 字符具有 5 位以上的 Unicode 代码时,将其替换为其 Unicode 代码点

转载 作者:行者123 更新时间:2023-12-05 04:21:45 30 4
gpt4 key购买 nike

我想创建一个 JS 脚本,它可以识别字符串中的非 ASCII 字符并将它们替换为相应的 Unicode 代码点(即 Lorem ipsum á dolor sit amet 变为 Lorem ipsum [00E1] sit amet )。我已经为此创建了一个基本程序,但我注意到它将代码点中超过 5 位的字符(例如 𝔸,即 Unicode U+1D538)解释为两个单独的字符:

function findNonAsciiCodes(string) {
let k = string.replace(/[^ -~]/g, x => `[${x.codePointAt(0).toString(16).toUpperCase().padStart(4, '0')}]`);
console.log(k)
}
findNonAsciiCodes("Lorem ispum á dolor sit amet") // with 4 digit unicode character: [00E1]
findNonAsciiCodes("Lorem ipsum 𝔸 dolor sit amet") // with 5 digit unicode character: [D835][DD38] - undesired

在 StackOverflow 上进行一些挖掘之后,我发现 Java/JS 不能轻易地识别代码点中超过 4 位数字的 Unicode 字符——而是必须用 2 个字符的“代理对”( https://stackoverflow.com/questions/19557026/how-to-display-5-digit-unicode-characters-such-as-a-speaker-u1f50a) ) 来表示它们.

我想找到一种方法,最好使用 string.replace()并且没有 for 循环,为这些字符找到合适的代码点;然而,当使用 string.replace() 时, 它似乎产生两个单独的字符串而不是创建一个数组(即 "𝔸".replace(/[^ -~]/g, x => console.log(x.codePointAt(0).toString(16).toUpperCase())) 分别打印 D835DD38)。

我注意到同时匹配代理对的两个字符会产生所需的结果(完整的 5 位数代码),但我不知道如何创建可以区分代理对成员和相邻非 ASCII 的正则表达式人物;在下面的示例中 - 匹配 1 到 2 个非 ASCII 字符以 try catch 代理项对 - 4 位代码非 ASCII 字符可以与紧随其后的其他非 ASCII 字符“混合”,包括代理项对字符:

function findNonAsciiCodes(string) {
let k = string.replace(/[^ -~]{1,2}/g, x => `[${x.codePointAt(0).toString(16).toUpperCase().padStart(4, "0")}]`);
// regex matches between 1 and 2 non-ascii characters at once
console.log(k);
}
findNonAsciiCodes("Lorem ipsum 𝔸 dolor sit amet"); // gives correct code ([1D538])
findNonAsciiCodes("Lorem ipsum 𝔸á dolor sit amet"); // still gives correct codes ([1D538][00E1])
findNonAsciiCodes("Lorem ipsum áá dolor sit amet"); // 4 digit before 4 digit; ignores second character due to "blending" ([00E1])
// ^ desired output: Lorem ispum [00E1][00E1] dolor sit amet
findNonAsciiCodes("Lorem ipsum á𝔸 dolor sit amet"); // 4 digit before 5 digit, gives incorrect codes due to "blending" ([00E1][DD38])
// ^ desired output: Lorem ipsum [00E1][1D538] dolor sit amet

是否可以创建一个能够区分普通非 ASCII 字符和代理对字符的 Regex 表达式,或者在 .replace() 中使用 JS能够“解码”代理对?如果没有,是否可以在没有 for 的情况下达到预期的结果?循环?

最佳答案

可以使用(?![\x00-\uFFFF])./gu来匹配任何不属于BMP平面的Unicode字符点:

function findNonAsciiCodes(string) {
let k = string.replace(/(?![\x00-\uFFFF])./gu, x => `[${x.codePointAt(0).toString(16).toUpperCase().padStart(4, "0")}]`);
console.log(k);
}
findNonAsciiCodes("Lorem ipsum 𝔸 dolor sit amet"); // Lorem ipsum [1D538] dolor sit amet
findNonAsciiCodes("Lorem ipsum 𝔸á dolor sit amet"); // Lorem ipsum [1D538]á dolor sit amet
findNonAsciiCodes("Lorem ipsum áá dolor sit amet"); // Lorem ipsum áá dolor sit amet
findNonAsciiCodes("Lorem ipsum á𝔸 dolor sit amet"); // Lorem ipsum á[1D538] dolor sit amet

关于javascript - 当非 ASCII 字符具有 5 位以上的 Unicode 代码时,将其替换为其 Unicode 代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74157390/

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