2

对于 Basic Multilingual Plane 中的字符,我们可以使用 '\uxxxx' 转义它。例如,您可以使用 /[\u4e00-\u9fff]/ 来匹配一个常见的汉字(0x4e00-0x9fff 是 CJK 统一表意文字的范围)。

但是对于基本多语言平面之外的字符,它们的代码大于 0xffff。所以你不能使用格式'\uxxxx'来转义它,因为'\u20000'表示字符'\u2000'和字符'0',而不是代码为0x20000的字符。

如何将字符转义出基本多语言平面?直接使用这些字符不是一个好主意,因为它们无法在大多数字体中显示。

4

3 回答 3

2

Javascript 不能直接识别 BMP 之外的字符——它们在内部表示为 UTF-16 代理对。例如,您提到的字符 U+20000(当前分配给“CJK Unified Ideographs Ext. B”)表示为代理对 U+D840 U+DC00。作为一个 Javascript 字符串,这只是"\u2840\uDC00". (请注意,s.length此字符串为 2,即使它显示为单个字符。)

维基百科有关于所用编码方案的详细信息。

于 2012-11-02T23:48:10.143 回答
1

您可以使用一对转义的代理代码点,如@duskwuff 的回答中所述。您可以使用我的完整 Unicode 输入实用程序来获取符号(按钮“显示 \u”),或使用 Fileformat.info字符搜索来找到它们(项目“C/C++/Java 源代码”,因为 JavaScript 使用相同的这里的符号)。

或者,您可以直接输入字符:“您可以将非 BMP 字符本身输入到 JavaScript 代码中的字符串文字中,无论是在单独的文件中还是嵌入在 HTML 中。自然,您需要在您使用的编辑器中提供合适的 Unicode 支持。但是 JavaScript 实现不需要在程序源中支持非 BMP 字符。他们可能会这样做,而现代浏览器实现通常会这样做。” (使用 JavaScript 和 Globalize.js 走向全球,第 177 页)有一些注意事项,例如正确声明字符编码。

字体支持是一个不同的问题,但是在处理字符时,您通常希望在某个时候看到它们,至少在测试中是这样。所以你或多或少需要一些覆盖字符的字体。Fileformat.info 页面还包含指向浏览器支持信息的链接,例如(U+20000) 字体支持- 一个很好的起点,虽然还不够完整。例如,''在 SimSun-ExtB 中也支持U+20000

于 2012-11-03T06:54:01.570 回答
1

有趣的问题。

现在我们有了ES6我们可以这样做

let newSpeak = '\u{1F4A9}'

请注意,在内部它仍然是带有代理对的UTF-16

newSpeak.length === 2 // "wrong"
[...newSpeak].length === 1
newSpeak === '\uD83D\uDCA9'

Unicode 是巨大的

此外,它不仅仅是文字:

newSpeak.charCodeAt(0) === 0xD83D // "wrong"
newSpeak.codePointAt(0) === 0x1F4A9

String.fromCharCode(0x1F4A9) !== newSpeak
String.fromCodePoint(0x1F4A9) === newSpeak

for (let i = 0; i < newSpeak.length; i++) console.log(newSpeak[i]) // "wrong"
for (let c of newSpeak) console.log(c)

[...''].map(c => `__${c}`).join('') === "____"

我 处理 Unicode。

于 2016-09-17T04:01:49.730 回答