JavaScript 对åç¬¦ä¸²ä½¿ç¨ Unicode ç¼ç ã大夿°åç¬¦ä½¿ç¨ 2 个åèç¼ç ï¼ä½è¿ç§æ¹å¼åªè½ç¼ç æå¤ 65536 个å符ã
è¿ä¸ªèå´ä¸è¶³ä»¥å¯¹ææå¯è½çå符è¿è¡ç¼ç ï¼è¿å°±æ¯ä¸ºä»ä¹ä½¿ç¨ 4 个åè对ä¸äºç½è§çå符è¿è¡ç¼ç ï¼æ¯å¦ ð³ï¼æ°å¦ç¬¦å· Xï¼æ ðï¼ç¬è¸ï¼ï¼ä¸äºè±¡å½¢æåççã
ä¸é¢æ¯ä¸äºå符对åºç Unicode å¼ï¼
| å符 | Unicode | Unicode ä¸çåèæ° |
|---|---|---|
| a | 0x0061 |
2 |
| â | 0x2248 |
2 |
| ð³ | 0x1d4b3 |
4 |
| ð´ | 0x1d4b4 |
4 |
| ð | 0x1f604 |
4 |
æä»¥å a å â è¿æ ·çå符å ç¨ 2 个åèï¼è ð³ï¼ð´ å ð ç对åºç¼ç åæ´é¿ï¼å ç¨ 4 个åèã
å¾ä¹ 以åï¼å½ JavaScript 被åæåºæ¥çæ¶åï¼Unicode ç¼ç è¦æ´å ç®åï¼å½æ¶æ²¡æ 4 个åèçå符ãæä»¥ï¼æäºè¯è¨åè½ç°å¨ä»æ æ³æ£ç¡®å¤çå®ä»¬ã
æ¯å¦ length 认为è¿éæ 2 个å符ï¼
alert('ð'.length); // 2
alert('ð³'.length); // 2
â¦â¦ä½æä»¬å¯ä»¥æ¸
æ¥å°è®¤è¯å°è¿éåªæä¸ä¸ªå符ï¼å¯¹å§ï¼å
³é®å¨äº length æ 4 个åèå½æäº 2 个 2 åèé¿çå符ãè¿æ¯ä¸å¯¹çï¼å 为å®ä»¬å¿
须被å½ä½ä¸ä¸ªæ´ä½æ¥èèï¼å³æè°çâ代ç对ï¼surrogate pairï¼âï¼ä½ å¯ä»¥å¨ å符串 ä¸é
读å
³äºä»£çå¯¹çæ´å¤ä¿¡æ¯ï¼ã
é»è®¤æ åµä¸ï¼æ£å表达å¼ä¹ä¼æä¸ä¸ª 4 个åèçâé¿å符â彿ä¸å¯¹ 2 个åèé¿çåç¬¦ãæ£å¦å¨å符串ä¸éå°çæ åµï¼è¿å°å¯¼è´ä¸äºå¥æªçç»æãæä»¬å¾å¿«ä¼å¨åé¢çç« è éååèå´ [...] ä¸éå°ã
ä¸å符串ææä¸åçæ¯ï¼æ£åè¡¨è¾¾å¼æä¸ä¸ªä¿®é¥°ç¬¦ u 被ç¨ä»¥è§£å³æ¤ç±»é®é¢ãå½ä¸ä¸ªæ£å表达å¼å¸¦æè¿ä¸ªä¿®é¥°ç¬¦åï¼4 个åèé¿çå符å°è¢«æ£ç¡®å°å¤çãåæ¶ä¹è½å¤ä½¿ç¨ Unicode 屿§è¿è¡æ¥æ¾äºï¼æä»¬æ¥ä¸æ¥å°±ä¸èµ·å¦ä¹ å®å§ã
Unicode 屿§ \p{â¦}
Unicode ä¸çæ¯ä¸ªåç¬¦é½æå¾å¤å±æ§ãå®ä»¬æè¿°äºå符æå±çâç±»å«âï¼å å«äºå ³äºå符çåç§ä¿¡æ¯ã
ä¾å¦ï¼å¦æä¸ä¸ªå符å
·æ Letter 屿§ï¼è¿æå³çè¿ä¸ªå符å½å±äºï¼ä»»æè¯è¨çï¼åæ¯è¡¨ãè Number 屿§åè¡¨ç¤ºè¿æ¯ä¸ä¸ªæ°åï¼ä¹è®¸æ¯é¿æä¼¯æ°åï¼äº¦ææ¯ä¸ææ°åï¼ççã
æä»¬å¯ä»¥æ¥æ¾å
·ææç§å±æ§çå符ï¼åä½ \p{â¦}ã为äºä½¿ç¨ \p{â¦}ï¼ä¸ä¸ªæ£å表达å¼å¿
须使ç¨ä¿®é¥°ç¬¦ uã
举个ä¾åï¼\p{Letter} 表示任ä½è¯è¨ä¸çä¸ä¸ªåæ¯ãæä»¬ä¹å¯ä»¥ä½¿ç¨ \p{L}ï¼å 为 L æ¯ Letter çä¸ä¸ªå«åãå¯¹äºæ¯ç§å±æ§èè¨ï¼å ä¹é½åå¨å¯¹åºç缩åå«åã
å¨ä¸é¢çä¾åä¸ä¼æ¾åºæ¥ 3 ç§åæ¯ï¼è±è¯ãæ ¼é²åäºè¯åé©è¯ã
let str = "A á ã±";
alert( str.match(/\p{L}/gu) ); // A,á,ã±
alert( str.match(/\p{L}/g) ); // nullï¼æ²¡æå¹é
项ï¼å 为没æä¿®é¥°ç¬¦ "u"ï¼
以䏿¯ä¸»è¦çå符类å«åå®ä»¬å¯¹åºçåç±»å«ï¼
- 忝ï¼Letterï¼
Lï¼- å°åï¼lowercaseï¼
Llï¼ - 修饰ï¼modifierï¼
Lmï¼ - é¦åæ¯å¤§åï¼titlecaseï¼
Ltï¼ - 大åï¼uppercaseï¼
Luï¼ - å
¶å®ï¼otherï¼
Loã
- å°åï¼lowercaseï¼
- æ°åï¼Numberï¼
Nï¼- åè¿å¶æ°åï¼decimal digitï¼
Ndï¼ - 忝æ°åï¼letter numberï¼
Nlï¼ - å
¶å®ï¼otherï¼
Noã
- åè¿å¶æ°åï¼decimal digitï¼
- æ ç¹ç¬¦å·ï¼Punctuationï¼
Pï¼- è¿æ¥ç¬¦ï¼connectorï¼
Pcï¼ - 横æ ï¼dashï¼
Pdï¼ - èµ·å§å¼å·ï¼initial quoteï¼
Piï¼ - ç»æå¼å·ï¼final quoteï¼
Pfï¼ - å¼ï¼openï¼
Psï¼ - éï¼closeï¼
Peï¼ - å
¶å®ï¼otherï¼
Poã
- è¿æ¥ç¬¦ï¼connectorï¼
- æ è®°ï¼Markï¼
Mï¼accents etcï¼ï¼- é´éåå¹¶ï¼spacing combiningï¼
Mcï¼ - å°éï¼enclosingï¼
Meï¼ - éé´éï¼non-spacingï¼
Mnã
- é´éåå¹¶ï¼spacing combiningï¼
- 符å·ï¼Symbolï¼
Sï¼- è´§å¸ï¼currencyï¼
Scï¼ - 修饰ï¼modifierï¼
Skï¼ - æ°å¦ï¼mathï¼
Smï¼ - å
¶å®ï¼otherï¼
Soã
- è´§å¸ï¼currencyï¼
- åé符ï¼Separatorï¼
Zï¼- è¡ï¼lineï¼
Zlï¼ - 段è½ï¼paragraphï¼
Zpï¼ - ç©ºæ ¼ï¼spaceï¼
Zsã
- è¡ï¼lineï¼
- å
¶å®ï¼Otherï¼
Cï¼- æ§å¶ç¬¦ï¼controlï¼
Ccï¼ - æ ¼å¼ï¼formatï¼
Cfï¼ - æªåé
ï¼not assignedï¼
Cnï¼ - ç§æï¼private useï¼
Coï¼ - 代ç伪å符ï¼surrogateï¼
Csã
- æ§å¶ç¬¦ï¼controlï¼
å æ¤ï¼æ¯å¦è¯´æä»¬éè¦å°åç忝ï¼å°±å¯ä»¥åæ \p{Ll}ï¼æ ç¹ç¬¦å·åä½ \p{P} ççã
ä¹æå ¶å®æ´¾ççç±»å«ï¼ä¾å¦ï¼
Alphabeticï¼Alphaï¼ï¼å å«äºåæ¯Lï¼å ä¸åæ¯æ°åNlï¼ä¾å¦ â « ââ ç½é©¬æ°å 12ï¼ï¼å ä¸ä¸äºå ¶å®ç¬¦å·Other_Alphabeticï¼OAlphaï¼ãHex_Digitå æ¬ 16 è¿å¶æ°å0-9ï¼a-fã- â¦â¦ççã
Unicode æ¯æå¾å¤ä¸åç屿§ï¼ååºæ´ä¸ªæ¸ åéè¦å ç¨å¤§éçç¯å¹ ï¼å æ¤å¨è¿éååºç¸å ³ç龿¥ï¼
- ååºä¸ä¸ªåç¬¦çææå±æ§ï¼https://unicode.org/cldr/utility/character.jsp.
- æç §å±æ§ååºææçå符ï¼https://unicode.org/cldr/utility/list-unicodeset.jsp.
- 屿§ç对åºç¼©åå½¢å¼ï¼https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt.
- ä»¥ææ¬æ ¼å¼æ´ççææ Unicode å符ï¼å å«äºææç屿§ï¼https://www.unicode.org/Public/UCD/latest/ucd/.
举ä¾ï¼16 è¿å¶æ°å
举个ä¾åï¼è®©æä»¬æ¥æ¥æ¾ 16 è¿å¶æ°åï¼åä½ xFF å
¶ä¸ F æ¯ä¸ä¸ª 16 è¿å¶çæ°åï¼0â¦9 æè
Aâ¦Fï¼ã
ä¸ä¸ª 16 è¿å¶æ°åå¯ä»¥è¡¨ç¤ºä¸º \p{Hex_Digit}ï¼
let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
alert("number: xAF".match(regexp)); // xAF
举ä¾ï¼ä¸æå符
让æä»¬åæ¥æ¥æ¾ä¸æå符ã
æä¸ä¸ª Unicode 屿§ Scriptï¼ä¸ä¸ªä¹¦åç³»ç»ï¼ï¼è¿ä¸ªå±æ§å¯è½æä¸ä¸ªå¼ï¼CyrillicãGreekãArabicãHanï¼ä¸æï¼ççï¼è¿éæ¯ä¸ä¸ªå®æ´çå表ã
è¦å¨ç»å®ç书åç³»ç»ä¸æ¥æ¾åç¬¦ï¼æä»¬éè¦ä½¿ç¨ Script=<value>ï¼ä¾å¦å¯¹äºè¥¿éå°åæ¯ï¼\p{sc=Cyrillic}ï¼ä¸æè±¡å½¢æåï¼\p{sc=Han}ï¼ççã
let regexp = /\p{sc=Han}/gu; // è¿åä¸æè±¡å½¢æå
let str = `Hello ÐÑÐ¸Ð²ÐµÑ ä½ å¥½ 123_456`;
alert( str.match(regexp) ); // ä½ ,好
举ä¾ï¼è´§å¸
表示货å¸çå符ï¼ä¾å¦ $ã⬠å Â¥ï¼å
·æ Unicode 屿§ \p{Currency_Symbol}ï¼ç¼©å为 \p{Sc}ã
让æä»¬ç¨å®æ¥æ¥æ¾æ ¼å¼ä¸ºâè´§å¸ï¼æ¥çæ¯ä¸ä¸ªæ°åâçä»·æ ¼ï¼
let regexp = /\p{Sc}\d/gu;
let str = `Prices: $2, â¬1, Â¥9`;
alert( str.match(regexp) ); // $2,â¬1,Â¥9
ç¨åï¼å¨æç« éè¯ +, *, ? å {n} 䏿们å°å¦ä¹ å¦ä½æ¥æ¾å å«å¾å¤ä½çæ°åã
æ»ç»
修饰符 u 表示å¯ç¨æ£å表达å¼ä¸å¯¹ Unicode çæ¯æã
è¿æå³ç两件äºï¼
- 4 个åèé¿çå符被以æ£ç¡®çæ¹å¼å¤çï¼è¢«çæå个å符ï¼è䏿¯ 2 个 2 åèé¿çå符ã
- Unicode 屿§å¯ä»¥è¢«ç¨äºæ¥æ¾ï¼
\p{â¦}ã
æäº unicode 屿§æä»¬å¯ä»¥æ¥æ¾ç»å®è¯è¨ä¸çè¯ï¼ç¹æ®å符ï¼å¼ç¨ï¼è´§å¸ï¼ççã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼