æ¬èå°æ´æ·±å ¥å°ä»ç»å符串çå é¨åçãå¦æä½ æç®å¤ç表æ 符å·ï¼emojiï¼ãç½è§çæ°å¦æè±¡å½¢æååç¬¦ï¼æå ¶ä»ç½è§å符ï¼è¿äºç¥è¯å°å¯¹ä½ 徿ç¨ã
æ£å¦æä»¬æç¥ï¼JavaScript çå符串æ¯åºäº Unicode çï¼æ¯ä¸ªåç¬¦ç± 1-4 个åèçåèåºå表示ã
JavaScript å 许æä»¬éè¿ä¸è¿°ä¸ç§è¡¨ç¤ºæ¹å¼ä¹ä¸å°ä¸ä¸ªåç¬¦ä»¥å ¶åå è¿å¶ Unicode ç¼ç çæ¹å¼æå ¥å°å符串ä¸ï¼
-
\xXXXXå¿ é¡»æ¯ä»äº00ä¸FFä¹é´ç两ä½åå è¿å¶æ°ï¼\xXX表示 Unicode ç¼ç 为XXçå符ãå 为
\xXX符å·åªæ¯æä¸¤ä½åå è¿å¶æ°ï¼æä»¥å®åªè½ç¨äºå 256 个 Unicode å符ãè¿å 256 个åç¬¦å æ¬æä¸åæ¯ãæåºæ¬çè¯æ³å符åå ¶ä»ä¸äºå符ãä¾å¦ï¼
"\x7A"表示"z"(Unicode ç¼ç 为U+007A)ãalert( "\x7A" ); // z alert( "\xA9" ); // © (çæç¬¦å·) -
\uXXXXXXXXå¿ é¡»æ¯ 4 ä½åå è¿å¶æ°ï¼å¼ä»äº0000åFFFFä¹é´ãæ¤æ¶ï¼\uXXXX便表示 Unicode ç¼ç 为XXXXçå符ãUnicode å¼å¤§äº
U+FFFFçå符ä¹å¯ä»¥ç¨è¿ç§æ¹æ³æ¥è¡¨ç¤ºï¼ä½å¨è¿ç§æ åµä¸ï¼æä»¬è¦ç¨å°ä»£çå¯¹ï¼æä»¬å°å¨æ¬ç« çåé¢è®¨è®ºå®ï¼ãalert( "\u00A9" ); // ©, çåäº \xA9ï¼åªæ¯ä½¿ç¨äºåä½åå è¿å¶æ°è¡¨ç¤ºèå·² alert( "\u044F" ); // Ñï¼è¥¿éå°åæ¯ï¼ alert( "\u2191" ); // âï¼ä¸ç®å¤´ç¬¦å·ï¼ -
\u{Xâ¦XXXXXX}Xâ¦XXXXXXå¿ é¡»æ¯ä»äº0å10FFFFï¼Unicode å®ä¹çæé«ç ä½ï¼ä¹é´ç 1 å° 6 个åèçåå è¿å¶å¼ãè¿ç§è¡¨ç¤ºæ¹å¼è®©æä»¬è½å¤è½»æ¾å°è¡¨ç¤ºææç°æç Unicode å符ãalert( "\u{20331}" ); // 佫, ä¸ä¸ªä¸å¸¸è§ç䏿å符ï¼é¿ Unicodeï¼ alert( "\u{1F60D}" ); // ð, ä¸ä¸ªå¾®ç¬ç¬¦å·ï¼å¦ä¸ä¸ªé¿ Unicodeï¼
代ç对
ææå¸¸ç¨åç¬¦é½æå¯¹åºç 2 åèé¿åº¦çç¼ç ï¼4 ä½åå è¿å¶æ°ï¼ã大夿°æ¬§æ´²è¯è¨çåæ¯ãæ°åã以ååºæ¬ç»ä¸ç CJK 表ææåéï¼CJK ââ æ¥èªä¸æãæ¥æå驿书åç³»ç»ï¼ä¸ç忝ï¼åæå¯¹åºç 2 åèé¿åº¦ç Unicode ç¼ç ã
æåï¼JavaScript æ¯åºäº UTF-16 ç¼ç çï¼åªå 许æ¯ä¸ªå符å 2 个åèé¿åº¦ãä½ 2 个åèåªå 许 65536 ç§ç»åï¼è¿å¯¹äºè¡¨ç¤º Unicode éæ¯ä¸ªå¯è½ç¬¦çå·æ¥è¯´ï¼æ¯ä¸å¤çã
å æ¤ï¼éè¦ä½¿ç¨è¶ è¿ 2 个åèé¿åº¦æ¥è¡¨ç¤ºçç¨æç¬¦å·ï¼æä»¬å使ç¨ä¸å¯¹ 2 åèé¿åº¦çå符ç¼ç ï¼å®è¢«ç§°ä¸ºâ代ç对âï¼surrogate pairï¼ã
è¿ç§å乿å¯ä½ç¨ ââ è¿äºç¬¦å·çé¿åº¦ä¸º 2ï¼
alert( 'ð³'.length ); // 2, 大åçæ°å¦ç¬¦å· X
alert( 'ð'.length ); // 2, ç¬åç表æ
alert( 'ð©·¶'.length ); // 2, ä¸ä¸ªå°è§ç䏿å符
è¿æ¯å ä¸ºå¨ JavaScript 被åé åºæ¥çæ¶åï¼ä»£ç对è¿ä¸ªæ¦å¿µå¹¶ä¸åå¨ï¼å æ¤è¯è¨å¹¶æ²¡ææ£ç¡®å¤çå®ä»¬ï¼
è½ç¶ä¸é¢çæ¯ä¸ªå符串é½åªæä¸ä¸ªå符ï¼ä½å
¶ length 屿§æ¾ç¤ºå
¶é¿åº¦ä¸º 2ã
å¦ä½è·åè¿äºç¬¦å·ï¼ä¹æ¯ä¸ä¸ªæ£æçé®é¢ï¼å 为ç¼ç¨è¯è¨ç大é¨ååè½é½å°ä»£ç对å½ä½ä¸¤ä¸ªåç¬¦å¯¹å¾ ã
举个ä¾åï¼æä»¬å¯ä»¥å¨è¾åºä¸çå°ä¸¤ä¸ªå¥æªçå符ï¼
alert( 'ð³'[0] ); // æ¾ç¤ºåºäºä¸ä¸ªå¥æªç符å·...
alert( 'ð³'[1] ); // ...代ç对ççæ®µ
代ç对ççæ®µå¤±å»å½¼æ¤å°±æ²¡ææä¹ãæä»¥ä¸é¢ç¤ºä¾ä¸ alert() æå°åºçå
容å
¶å®å°±æ¯æ²¡æä»»ä½æä¹çåå¾ä¿¡æ¯ã
仿æ¯ä¸è®²ï¼å¯ä»¥éè¿ä»£ç对çç¼ç æ¥æ£æµä»£ç对ï¼å¦æä¸ä¸ªå符çç¼ç å¨ 0xd800..0xdbff è¿ä¸ªèå´ä¸ï¼é£ä¹å®å°±æ¯ä»£ç对çåä¸ä¸ªé¨åãä¸ä¸ä¸ªå符ï¼ç¬¬äºé¨åï¼çç¼ç å¿
é¡»å¨ 0xdc00..0xdfff èå´ä¸ãè¿ä¸¤ä¸ªèå´ä¸çç¼ç æ¯è§èä¸ä¸ä¸ºä»£ç对é¢ççã
åºäºæ¤ï¼JavaScript æ°å¢äº String.fromCodePoint å str.codePointAt è¿ä¸¤ä¸ªæ¹æ³æ¥å¤ç代ç对ã
å®ä»¬æ¬è´¨ä¸ä¸ String.fromCharCode å str.charCodeAt ç¸åï¼ä½å®ä»¬å¯ä»¥æ£ç¡®å°å¤ç代ç对ã
å¨è¿éå¯ä»¥çåºå®ä»¬çåºå«ï¼
// charCodeAt ä¸ä¼èè代çå¯¹ï¼æä»¥è¿åäº ð³ ååé¨åçç¼ç :
alert( 'ð³'.charCodeAt(0).toString(16) ); // d835
// codePointAt å¯ä»¥æ£ç¡®å¤ç代ç对
alert( 'ð³'.codePointAt(0).toString(16) ); // 1d4b3ï¼è¯»åå°äºå®æ´ç代ç对
ä¹å°±æ¯è¯´ï¼å¦ææä»¬ä» ð³ çä½ç½® 1 å¼å§è·å对åºçç¼ç ï¼è¿ä¹åæ¯ä¸å¯¹çï¼ï¼é£ä¹è¿ä¸¤ä¸ªæ¹æ³é½åªä¼è¿åæ¤ä»£ç对çååé¨åï¼
alert( 'ð³'.charCodeAt(1).toString(16) ); // dcb3
alert( 'ð³'.codePointAt(1).toString(16) ); // dcb3
// æ æä¹ç代ç对ååé¨å
ä½ ç¨åå¯ä»¥å¨ Iterable objectï¼å¯è¿ä»£å¯¹è±¡ï¼ ä¸ç« 䏿¾å°æ´å¤å¤ç代çå¯¹çæ¹å¼ãå¯è½ä¹æä¸é¨å¤ç代ç对çåºï¼ä½æ²¡æè¶³å¤æµè¡å°å¯ä»¥è®©æä»¬å¨è¿éæ¨èçåºã
æä»¬ä¸è½éæå¨ä»»æä½ç½®å¯¹å符串è¿è¡æåï¼ä¾å¦éè¿ str.slice(0, 4) è·åä¸ä¸ªå符串ï¼å¹¶æå¾
宿¯ä¸ä¸ªææçå符串ï¼
alert( 'hi ð'.slice(0, 4) ); // hi [?]
å¨è¿éï¼æä»¬çå°ä¸ä¸ªæ²¡ææä¹çåå¾å符被æå°äºåºæ¥ï¼ç¬å表æ 代ç对çååé¨åï¼ã
å¦æä½ ææå¯é å°ä½¿ç¨ä»£ç对ï¼è¯·æ³¨æè¿ä¸ç¹ãè¿å¯è½å¹¶ä¸æ¯ä»ä¹å¤§é®é¢ï¼ä½è³å°ä½ åºè¯¥ç¥éåçäºä»ä¹ã
åé³ç¬¦å·åè§èå
å¾å¤è¯è¨é½æç±åºç¡å符åå ¶ä¸æ¹/䏿¹çæ è®°æç»æç符å·ã
举个ä¾åï¼åæ¯ a å°±æ¯è¿äºå符 Ã Ã¡Ã¢Ã¤Ã£Ã¥Ä çåºç¡å符ã
大夿°å¸¸è§çâå¤åâåç¬¦å¨ Unicode 表ä¸é½æèªå·±çç¼ç ãä½ä¸æ¯ææè¿äºåç¬¦é½æèªå·±çç¼ç ï¼å 为å¯è½çç»åå½¢å¼å¤ªå¤äºã
ä¸ºäºæ¯æä»»æçç»åï¼Unicode æ åå 许æä»¬ä½¿ç¨å¤ä¸ª Unicode å符ï¼åºç¡å符åè·çä¸ä¸ªæå¤ä¸ªâè£ é¥°âå®çâæ è®°âå符ã
ä¾å¦ï¼å¦ææä»¬å¨ S åéå ä¸ç¹æ®çâ䏿¹çç¹âå符ï¼ç¼ç 为 \u0307ï¼ï¼åæ¾ç¤ºä¸º á¹ ã
alert( 'S\u0307' ); // SÌ
妿æä»¬éè¦å¨åæ¯ä¸æ¹ï¼æä¸æ¹ï¼æ·»å ä¸ä¸ªé¢å¤çæ è®° ââ å¾ç®åï¼åªéæ·»å å¿ è¦çæ è®°å符å³å¯ã
ä¾å¦ï¼å¦ææä»¬ç»§ç»å¨åé¢éå ä¸ä¸ªâ䏿¹çç¹â符å·ï¼ç¼ç \u0323ï¼ï¼é£ä¹æä»¬å°å¾å°ä¸ä¸ªâä¸ä¸é½æä¸ä¸ªç¹ç¬¦å·ç Sâï¼á¹¨ã
å°±åè¿æ ·ï¼
alert( 'S\u0307\u0323' ); // SÌÌ£
è¿æä¾äºæå¤§ççµæ´»æ§ï¼ä½ä¹å¸¦æ¥äºä¸ä¸ªæè¶£çé®é¢ï¼ä¸¤ä¸ªå符å¯è½å¨è§è§ä¸çèµ·æ¥ç¸åï¼ä½å´ä½¿ç¨çæ¯ä¸åç Unicode ç»åã
举个ä¾åï¼
let s1 = 'S\u0307\u0323'; // SÌÌ£, S + 䏿¹ç¹ç¬¦å· + 䏿¹ç¹ç¬¦å·
let s2 = 'S\u0323\u0307'; // SÌ£Ì, S + 䏿¹ç¹ç¬¦å· + 䏿¹ç¹ç¬¦å·
alert( `s1: ${s1}, s2: ${s2}` );
alert( s1 == s2 ); // 尽管è¿ä¸¤ä¸ªåç¬¦å¨æä»¬çæ¥æ¯ç¸éçï¼ä½ç»æå´æ¯ false
âUnicode è§èåâç®æ³å¯ä»¥è§£å³è¿ä¸ªé®é¢ï¼è¯¥ç®æ³å°æ¯ä¸ªå符串转æ¢ä¸ºåä¸çâè§èçâå½¢å¼ã
å¯ä»¥åå© str.normalize() å®ç°è¿ä¸ç¹ã
alert( "S\u0307\u0323".normalize() == "S\u0323\u0307".normalize() ); // true
æææçæ¯ï¼å¨æä»¬è¿ä¸ªä¾åä¸ï¼normalize() å° 3 个å符çåºåå并为äºä¸ä¸ªå符ï¼\u1e68ï¼å¸¦æä¸ä¸ä¸¤ä¸ªç¹ç Sï¼ã
alert( "S\u0307\u0323".normalize().length ); // 1
alert( "S\u0307\u0323".normalize() == "\u1e68" ); // true
ä½å®é
å¹¶éæ»æ¯å¦æ¤ãåºç°è¿ç§æ
åµçåå æ¯ç¬¦å· Ṩ æ¯âè¶³å¤å¸¸è§çâï¼æä»¥ Unicode å建è
å°å
¶åæ¬å¨äº Unicode 主表ä¸ï¼å¹¶ä¸ºå
¶æä¾äºå¯¹åºçç¼ç ã
å¦æä½ æ³äºè§£å ³äº Unicode è§èåè§åååä½çæ´å¤ä¿¡æ¯ï¼å¯ä»¥åé Unicode æ åçéå½ä¸çå 容ï¼Unicode è§èåå½¢å¼ãä½å°±å®ç¨èè¨ï¼æ¬èä¸çä¿¡æ¯å°±å·²ç»è¶³å¤äºã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼