2012-11-02 31 views
1

對於基本多語言平面中的字符,我們可以使用'\ uxxxx'轉義它。例如,您可以使用/ [\ u4e00- \ u9fff] /來匹配一個普通的中文字符(0x4e00-0x9fff是CJK Unified Ideographs的範圍)。如何從基本多語言平面中逃離角色?

但是對於超出基本多語言平面的字符,它們的代碼大於0xffff。所以你不能使用格式'\ uxxxx'來轉義它,因爲'\ u20000'表示字符'\ u2000'和字符'0',而不是代碼是0x20000的字符。

如何從基本多語言平面中轉義字符?直接使用這些字符不是一個好主意,因爲它們不能以大多數字體顯示。

+0

@millimoose呃,但這個問題是關於** javascript **,而不是java。 – user805627

+0

哎呀,我的壞。(儘管如此,你可能已經被搞砸了;如果不是更多的話) – millimoose

+0

相關:[BMP以外的JavaScript字符串](http://stackoverflow.com/questions/3744721/javascript-strings-outside-of-the -BMP) – millimoose

回答

1

您可以使用一對逃脫代理碼點的,如@ duskwuff的答案描述。您可以使用我的Full Unicode input utility來獲取符號(按鈕「Show \ u」),或使用Fileformat.info character search找到它們(項目「C/C++/Java源代碼」,因爲JavaScript在此使用相同的符號)。

或者,你可以直接輸入的字符:「你可以在你的JavaScript代碼輸入非BMP字符這樣成字符串字面量,無論是在一個單獨的文件或嵌入在HTML中。自然地,您需要在您使用的編輯器中提供合適的Unicode支持。但JavaScript實現不需要支持程序源中的非BMP字符。他們可能會和現代瀏覽器實現一般。「(使用JavaScript和Globalize.js走向全球,第177頁)有些警告像正確聲明字符編碼。

字體支持是一個不同的問題,但是在使用字符時,您通常希望在任何時候都能看到它們,至少在測試中。所以你或多或少需要一些覆蓋角色的字體。 Fileformat.info頁面還包含指向瀏覽器支持信息的鏈接,例如(U+20000) Font Support - 一個很好的起點,儘管不完整。例如,U + 20000 ''也支持SimSun-ExtB

2

BMP以外的字符不直接被Javascript識別 - 它們在內部被表示爲UTF-16代理對。例如,您提到的字符U + 20000(當前分配給「CJK統一表意文字擴展B」)表示爲代理對U + D840 U + DC00。作爲Javascript字符串,這只是"\u2840\uDC00"。 (注意:s.length是2這個字符串,即使它顯示爲單個字符)。

Wikipedia has details on the encoding scheme used.

0

有趣的問題。

現在,我們有ES6we can do this

let newSpeak = '\u{1F4A9}' 

注意,在內部它仍然UTF-16surrogate pairs

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

Unicode is huge

而且,它不只是文字:

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的。