JavaScriptã¯ãã«ã¹ã¿ã ã®å®åæããªããšã BMPå€ã®Unicodeæå/ã³ãŒããã€ã³ãïŒã€ãŸãããšã³ã³ãŒãã«16ããã以äžãå¿ èŠãªãã®ïŒãé©åã«åŠçã§ããŸããã
以äžã®äŸã«ç€ºãããã«ããã®å¶éã¯PEG.jsã«ãåŒãç¶ãããŠããããã§ãã
ç¹ã«ã [\u1D400-\u1D419]
ïŒçŸåšã¯[áµ0-áµ9]
ïŒãŸãã¯åçã®[ð-ð]
ïŒãç¡å¹ãªæåç¯å²ããã¹ããŒããŸãïŒãªã©ã®ç¯å²ãæå®ã§ããããã«ããããšæããŸãããšã©ãŒïŒã ïŒãããŠãæ°ããES6è¡šèš[\u{1D400}-\u{1D419}]
ã䜿çšãããšã次ã®ãšã©ãŒãçºçããŸãïŒ SyntaxError: Expected "!", "$", "&", "(", ".", character class, comment, end of line, identifier, literal, or whitespace but "[" found.
ãïŒ
PEG.jsãžã®å€æŽãå¿ èŠãšããªããã®äœæ¥ãè¡ãæ¹æ³ãããã§ããããïŒ
ã³ãŒãäŸïŒ
ãã®ææ³ïŒ
//MathUpper = [ð-ð]+
MathUpperEscaped = [\u1D400-\u1D419]+
äºæ³ãããè¡åïŒ
æå®ãããææ³ããçæãããããŒãµãŒã¯ãããšãã°ãðððããæ£åžžã«è§£æããŸãã
å®éã®åäœïŒ
解æãšã©ãŒïŒ Line 1, column 1: Expected [áµ0-áµ9] but "
ïŒãŸãã¯ãä»ã®ã«ãŒã«ã®ã³ã¡ã³ãã解é€ãããšããç¡å¹ãªæåç¯å²ããšã©ãŒãçºçããŸããïŒ
æ£çŽãªãšããã PEG.jsææ³ããŒãµãŒãšJavaScriptã®äŸã®UnicodeãµããŒããæŽæ°ããããšãé€ã
ä»ã®ãšãããããç·æ¥ã®äººäºããã³ä»äºé¢é£ã®ãããžã§ã¯ãïŒ_PEG.js 0.x_ãå«ãïŒã«åãçµãã§ããéãUnicodeãããããç解ããŠãã誰ããPRãæäŸããã®ãåŸ ã¡ç¶ããŸãðããŸãã¯æçµçã«ã¯_PEGã®åŸã«ãããåé¿ããŸãã js v1_ãããããªããã
åèãŸã§ã«ããµãã²ãŒããã¢ã¯æ©èœããŠããããã§ãã ææ³start = result:[\uD83D\uDCA9]+ {return result.join('')}
u + 1F4A9ã§ããð©ã解æããŸãã result.joinïŒ ''ïŒã¯ãµãã²ãŒããã¢ãå
ã«æ»ãããšã«æ³šæããŠãã ãããããããªããšããã³ããŒã®ä»£ããã«['\uD83D','\uDCA9']
ãååŸããŸãã ç¯å²ã«ã¯åé¡ããããŸãã
ãµãã²ãŒããã¢ã®è©³çŽ°ïŒ https ïŒ
ããã¯ãOPãèŠæ±ãããã®ã«åã£ãŠä»£ãããã®ã§ã¯ãããŸããã
@drewnolané ãäžããŠãããŠããããšãð
æ®å¿µãªããããã®ææ³ã¯\uD83D\uD83D
ã解æããŸãã
ãã®åé¡ã«ééããä»ã®äººã®ããã«ïŒç§ã¯BMPã®å€ã®ã³ãŒããã€ã³ãã®å°ããªãµãã»ãããåŠçããã ãã§ãããšããç¹ã§å¹žéã§ããããã§ç§ã¯ãã®ãããã³ã°ã解æããŠããã«å転ããåã«ããããBMPã®ç§çšé åã«ãããã³ã°ããããšã«ãªããŸããã
ãã®è§£æ±ºçã¯ãäžè¬çãªã±ãŒã¹ã§ã¯æããã«åé¡ãæ±ããŠããŸãããç§ã®åé¡é åã§ã¯ããŸãæ©èœããŸãã
@ futagoza-説æããããã«æåãå°œãããŸãã ããã§ããã€ãã®åé¡ã«çŽé¢ããŠããŸãã
utf-16
ã ucs4
ãªã©ã§ãã ãããã¯ãæå³ãããããŒã¿ã§ããcodepoints
ããã€ããšããŠãšã³ã³ãŒããããæ¹æ³ã§ãã ããšãã°ã utf-16-le
ã䜿çšãããšãã»ãšãã©ã®æåãcode units
ãšåŒã°ãã2ãã€ãã®ãã¢ãšããŠãšã³ã³ãŒãã§ããŸãããã³ãŒãåäœã®ã°ã«ãŒãã䜿çšããŠãæ倧0x10ffff
ãŸã§ã®é«äŸ¡å€æåãè¡šçŸã§ããŸããç§ãããã欲ããã®ã§ãããçŸå®çã«ã¯ããã¯èµ·ãããªãã§ããã
ãªããŠãã£ãã誰ããã»ãŒ1幎åã«
ãªããããèåããªãã®ã
@StoneCypherç§ã¯ããªãã®å¿ã®ç«ã倧奜ãã§ãïŒ ãããããªãçŸåšã®ã¡ã³ããã«èŠåŽããã®ã§ããããã 誰ãäœãè² ã£ãŠããŸããã èªåã®ãã©ãŒã¯ãç¶æããŠã¿ãŸãããïŒ
çŸåšã®ã¡ã³ããã¯ããªãã PEGãåŒãç¶ãã 人ã¯äœããªãªãŒã¹ããŠããŸããã 圌ã¯æ¬¡ã®å¯å°æ»ã«3幎éåãçµãã åŸãèŠãç®ãæ°ã«å
¥ããªãã£ããšèšãã peg.js
ãã¹ãŠæšãŠãŠãäºææ§ã®ãªãå¥ã®èšèªã§æåããæžãããã®ããããçŽããŸããã ASTã
ãã®ããŒã«ã¯ães6ã¢ãžã¥ãŒã«ã®ãµããŒããtypescriptã®ãµããŒããç¢å°ã®ãµããŒããæ¡åŒµãããUnicodeãªã©ãä»ã®äººãæžãã1è¡ã®ä¿®æ£ãã³ãããããããã«ããã®ç·æ§ã3幎éåŸ ã£ãŠãããŠãŒã¶ãŒããŒã¹ã®ååã倱ããŸããã
圌ã«å䜵ãæ±ãã人ãåæ°äººããŠã圌ã¯ãããããããã¯ä»ã®ç§ã®è¶£å³ã®ãããžã§ã¯ãã§ããããããäœã§ããããæ°ã«å ¥ããªãããšèšãç¶ããŠããŸãã
å€ãã®äººããã®ããŒãµãŒã«åºã¥ããäŒç€Ÿãæã£ãŠããŸãã 圌ãã¯å®å šã«ãã蟌ãŸããŠããŸãã
ãã®ç·ã¯éåžžã«éèŠãªéå ·ã®ä¿å®è ã«ãªãããšãçŽæããäœã®ä¿å®ãããŠããŸããã ä»åºŠã¯ãä»ã®èª°ãã«ãã®ã©ã€ãã©ãªãè¯å¥œãªç¶æ ã«ä¿ã€ããã«ããŸãããã
èªåã®ãã©ãŒã¯ãç¶æããŠã¿ãŸãããïŒ
ç§ã¯ä»3幎éæã£ãŠããŸãã ç§ã®peg
ã§ã¯ã課é¡è¿œè·¡ã·ã¹ãã ã®ã»ãŒ3åã®1ãä¿®æ£ãããŠããŸãã
ç§ã¯ãããè€è£œããååãå€æŽããæ°ãããã©ãŒã¯ãäœæããŠãµã€ãºã®åé¡ãä¿®æ£ããã³ãããããããšããŸããã
ãããã®ä¿®æ£ãšã2017幎ãããã©ãã«ãŒã«ä¿åãããŠããä¿®æ£ãä»ã®ãã¹ãŠã®äººãåãåãæãæ¥ãŸããã
ãã®ç·ã¯ãã°ãç¶æããŠããŸããã 圌ã¯ãããæ»ãªããŠããã
å€åã®æã§ãã
@ drewnolan-ã€ãŸãããããèå³æ·±ããã©ããã¯
æ ¹æ¬çãªåé¡ãç解ããã«ã¯ãè¡šçŸã¬ãã«ã§ã¯ãªãããšã³ã³ãŒãã£ã³ã°ã¬ãã«ã®ããããã¿ãŒã³ã«ã€ããŠèããå¿ èŠããããŸãã
ã€ãŸããUnicodeå€ã240ã®å Žåãã»ãšãã©ã®äººã¯ãããã圌ã¯0b1111 0000
ãæå³ããããšæãã§ãããã ãããå®éã«ã¯ãUnicodeã240ãè¡šãæ¹æ³ã§ã¯ãããŸããã äžçªäžã®ãããã¯å€ãããã§ã¯ãªããã©ã°ã§ããããã127ãè¶
ãããã®ã¯2ãã€ãã§è¡šãããŸãã ã€ãŸããUnicodeã®240ã¯å®éã«ã¯ã¹ãã¬ãŒãžã«0b0000 0001 0111 0000
ã§ãïŒutf-7ã¯å®éã®ãã®ã§ãããã¿ã€ããã¹ã§ã¯ãªããéåžžã«å¥åŠãªãã®ã«ãªããŸãããã¡ããããŠã£ãããã£ã¢ã¯äœ¿çšãããŠããªããšèšã£ãŠããŸãããŠã£ãããã£ã¢ã¯ééã£ãŠããŸãã ãããã¯SMSãéä¿¡ããããã®ã§ããããã¯ããã©ãã£ãã¯å
šäœã§æãäžè¬çãªæåãšã³ã³ãŒãã§ããå¯èœæ§ããããŸããïŒ
ãããåé¡ã§ãã
ãã€ãSTUVWXYZãæžã蟌ãã å Žåãutf16ã§ucs4ããŒã¿ãããç©äºãååã«ã«ãããããå Žåãã»ãšãã©ã®å Žåãã¹ããŒãã«ã§çããããšãã§ããŸãã
128ã«äžåºŠã¯ã2ãã€ããè¶ ãããšã³ã³ãŒãã£ã³ã°ã®æåã®å Žåã¯ã§ããŸããã ïŒã²ã©ãç¹å®ã®æ°ã®ããã«èãããŸããïŒïŒ
2çªç®ã®ãã€ãäœçœ®ã®ããããããã䜿çšãããŠããå Žåããããååã«ã«ãããããšã1ã§ããã¯ãã®å Žæã«0ãè¿œå ãããŸãã ãã€ããªããŒã¿ãå€ã®æŠå¿µãåã³åé€ããããšã¯ãªãããããããã䞊ã¹ãŠã¹ããŒãã«ã§çããŸãã ãã³ãŒããããå€ã¯ãšã³ã³ãŒããããå€ãšåçã§ã¯ãªãããšã³ã³ãŒãã§ã¯ãªããã³ãŒããè¿œå ããŠããŸãã
ã»ãšãã©ã®çµµæåããã®ç¯å²å€ã«ããããšããããŸãã ãã ãããŸããªäžåœèªãã»ãšãã©ã®æ°åŠãèšèæ³ãªã©ãããã€ãã®èšèªã®å€§ããªå¡ã¯ããã§ã¯ãããŸããã
確ãã«ãããªãã®ã¢ãããŒãã¯ãã»ãšãã©ãã¹ãŠã®çµµæåãããã³Unicode 6ã䜿çšããã®ã«ååãªäžè¬çãªãã¹ãŠã®äººéã®èšèªã«åå察å¿ã§ããŸããããã¯ãçŸç¶ãå€§å¹ ã«æ¹åãããã®ã§ãã
ãã ãããã®PRã¯ãæ£ç¢ºæ§ãšäºæããªãããã©ãŒãã³ã¹ã®åé¡ã®äž¡æ¹ã«ã€ããŠååã«ãã¹ããããããå®éã«ããŒãžããå¿ èŠããããŸãïŒãŠãã³ãŒãã®ããã©ãŒãã³ã¹ã®åé¡ããphpãåæ¢ããçç±ã§ããããšãå¿ããªãã§ãã ããïŒã
. (dot character)
åŒã«ãUniââcodeã¢ãŒããå¿
èŠãªããã§ãã æ¯èŒïŒ
const string = '-ð-ð±-';
const symbols = (string.match(/./gu));
console.log(JSON.stringify(symbols, null, ' '));
const pegResult = require('pegjs/')
.generate('root = .+')
.parse(string);
console.log(JSON.stringify(pegResult, null, ' '));
åºåïŒ
[
"-",
"ð",
"-",
"ð±",
"-"
]
[
"-",
"\ud83d",
"\udc0e",
"-",
"\ud83d",
"\udc71",
"-"
]
ç§ã¯æè¿ããã«åãçµã¿ãïŒ616ãããŒã¹ãšããŠäœ¿çšããES6æ§æ\u{hhhhhhh}
ã䜿çšããããã«å€æŽããŸãããæ°æé以å
ã«ãPRãäœæããŸãã
ãµãã²ãŒãã«ãã£ãŠåå²ãããUTF-16æ£èŠè¡šçŸç¯å²ã®èšç®ã¯å°ãè€éã§ãããããã«ã¯https://github.com/mathiasbynens/regenerateã䜿çšããŸããã ããã¯ããã±ãŒãžpegjsã®æåã®äŸåé¢ä¿ã«ãªããŸãããããå¯èœã§ããããšãé¡ã£ãŠããŸãïŒäŸåé¢ä¿ãšããŠè¿œå ã§ããUnicodeããããã£ã®ããªãã£ã«ããããŸããïŒ648ãåç §ããŠãã ããïŒã UTF-16ãµãã²ãŒããããããªãå Žåã¯ããŠã£ãããã£ã¢ãåç §ããŠãã ããã
PEG.jsãUnicodeå šäœãšäºææ§ãæãããããã«ãããŸããŸãªã¬ãã«ããããŸãã
.
ãå®è£
ããŠã1ã€ãŸãã¯2ã€ã®ã³ãŒããŠãããããã£ããããŸãããããã«ãŒã«ã1ã€ãŸãã¯2ã€ã®ã³ãŒãåäœããã£ããã£ãããã©ããã«ãã£ãŠè§£æã®çµæãç°ãªãå¯èœæ§ãããããããã€ã³ã5ãé€ããŠãã»ãšãã©ã®ãã€ã³ãã§äžäœäºææ§ããããå€ããã®ãšéåžžã«ãã䌌ãããŒãµãŒãçæã§ããŸãã ãã®ããã«ããŠãŒã¶ãŒã2ã€ãŸãã¯3ã€ã®éžæè¢ããéžæã§ããããã«ããã©ã³ã¿ã€ã ãªãã·ã§ã³ãè¿œå ããããšãææ¡ããŸãã
æ£èŠè¡šçŸã¯ã©ã¹ã¯ãããŒãµãŒã®çæäžã«éçã«åæããŠãåºå®é·ïŒã³ãŒãåäœã®æ°ïŒããããã©ããã確èªã§ããŸãã 3ã€ã®ã±ãŒã¹ããããŸãïŒ1ãBMPãŸãã¯åäžã®ã³ãŒããŠãããã®ã¿ããŸãã¯2. 2ã€ã®ã³ãŒããŠãããã®ã¿ããŸãã¯3.ã©ã³ã¿ã€ã ã«å¿ããŠ1ã€ãŸãã¯2ã€ã®ã³ãŒããŠãããã ä»ã®ãšããããã€ãã³ãŒãã¯æ£èŠè¡šçŸã¯ã©ã¹ãåžžã«1ã€ã®ã³ãŒãåäœã§ãããšæ³å®ããŠããŸãïŒãããåç §ïŒã éçåæã䜿çšãããšãæåã®2ã€ã®ã±ãŒã¹ã§ããã®ãã€ãã³ãŒãåœä»€ã®ãã®ãã©ã¡ãŒã¿ãŒã1ãŸãã¯2ã«å€æŽã§ããŸãã ãããã3çªç®ã®ã±ãŒã¹ã§ã¯ãå®è¡æã«äžèŽããã³ãŒããŠãããã®æ°ãååŸããããã«å¿ããŠã«ãŒãœã«ãå¢ããããã«ãæ°ãããã€ãã³ãŒãåœä»€ãè¿œå ããå¿ èŠããããšæããŸãã æ°ãããã€ãã³ãŒãåœä»€ããªãä»ã®ãªãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã1ãäžèŽããã³ãŒããŠãããã®æ°ãåžžã«èšç®ããŸãããããã¯BMPã®ã¿ã®ããŒãµãŒã®è§£æäžã®ããã©ãŒãã³ã¹ã®äœäžã§ããããããã®ãªãã·ã§ã³ã¯å¥œãã§ã¯ãããŸããã 2.çŸåšã®ã³ãŒãåäœãé«ãµãã²ãŒãã§ããããã®åŸã«1ãŸãã¯2ã®å¢åã§äœãµãã²ãŒããç¶ããã©ãããèšç®ããŸãããããã¯ãææ³ãåžžã«æŽåœ¢åŒã®UTF-16ãµãã²ãŒãã§ãããåç¬ã®ãµãã²ãŒãã§ææ³ãèšè¿°ããå¯èœæ§ããªãããšãåæãšããŠããŸãïŒæ¬¡ã®ãã€ã³ããåç §ããŠãã ããïŒãããã¯ãBMPã®ã¿ã®ããŒãµãŒã®ããã©ãŒãã³ã¹ã®äœäžã§ããããŸãã
å€ç¬ãªãµãã²ãŒãã®åé¡ããããŸãïŒãã®åŸã®äœããµãã²ãŒãã®ãªãé«ããµãã²ãŒãããŸãã¯ãã®åã®é«ããµãã²ãŒãã®ãªãäœããµãã²ãŒãïŒã ããã«ã€ããŠã®ç§ã®æèŠã¯ãæ£èŠè¡šçŸã¯ã©ã¹ã¯æä»çã§ããå¿ èŠããããšããããšã§ããæŽåœ¢åŒã®UTF-16 UnicodeæåïŒBMPãŸãã¯é«ããµãã²ãŒãã®åŸã«äœããµãã²ãŒããç¶ãïŒãæã€åç¬ã®ãµãã²ãŒãã䜿çšããããææ³ã®äœæè ãæ°ä»ããªãå±éºæ§ããããŸãã UTF-16ã®åŸ®åŠãªç¹ã¯äž¡æ¹ãæ··ãåãããŠãããçµæãç解ããŠããŸãããUTF-16ãµãã²ãŒãã管çãããææ³äœæè ã¯ãç¹å®ã®é«ãµãã²ãŒããšäœãµãã²ãŒãéã®ãªã³ã¯ãèšè¿°ããããã«PEGã«ãŒã«ã䜿çšããŠãããè¡ãããšãã§ããŸãã ããŒãµãŒã®çæäžã«ãã®ã«ãŒã«ãé©çšããããžã¿ãŒãè¿œå ããããšãææ¡ããŸãã
çµè«ãšããŠãPEGããŒãµãŒã¯åžžã«åé²ãããããæ£èŠè¡šçŸãããPEGã§å€ç¬ãªãµãã²ãŒãã®åé¡ã管çããæ¹ãããããç°¡åã§ãããããã£ãŠã次ã®ã³ãŒããŠãããã¯èªèãããªãããèªèãããªããã®ã©ã¡ããã§ããé«ããµãã²ãŒããšäœããµãã²ãŒãã®é¢é£ä»ãã解é€ãããã®çµæãäžèŽããUnicodeæåã®æ°ãªã©ãå€æŽããŸãã
ã¢ã¹ãã©ã«Unicodeæåã®ES6æ§æã®PRã¯ïŒ616ã«åºã¥ãïŒ651ã§ãããã¯ã©ã¹ã®éçºã¯https://github.com/Seb35/pegjs/commit/0d33a7a4e13b0ac7c55a9cfaadc16fc0a5dd5f0cã§ãããäžèšã®ã³ã¡ã³ãã®ãã€ã³ã2ãš3ã®ã¿ãå®è£
ããŠã.
ïŒãã€ã³ã5ïŒã«ã€ããŠã¯ä»ã®ãšããäœãããŸããã
ãã®åé¡ã«é¢ããç§ã®çŸåšã®éçºã¯ã»ãŒçµäºããŠããŸããããé«åºŠãªäœæ¥ã¯
ã°ããŒãã«ãªåäœã¯ãJSæ£èŠè¡šçŸã®ãã©ã°unicode
unicode
ãšåæ§ã®ãªãã·ã§ã³[^a]
ã¯ããã¹ããð¯ããšäžèŽããã«ãŒãœã«ã¯2ã³ãŒãåäœå¢å ããŸãïŒã ãªãã·ã§ã³unicode
ãfalseã®å Žåãã«ãŒãœã«ã¯åžžã«1ã³ãŒãåäœã ãå¢å ããŸãã
å
¥åã«é¢ããŠã¯ãJSã®æ£èŠè¡šçŸãšåãæ¹æ³ã§PEG.jsãèšèšãããã©ããã¯ããããŸãããéãŠãã³ãŒãã¢ãŒãã®ææ³ã§[\u{1F4AD}-\u{1F4AF}]
ïŒ [\uD83D\uDCAD-\uD83D\uDCAF]
çžåœïŒãæ¿èªããå¿
èŠããããŸããïŒ ãå
¥åUnicodeããšãåºåUnicodeããåºå¥ããããšãã§ããŸãã
å人çã«ã¯ãå
¥åUnicodeãæ°žç¶çã«ããŸãã¯ããã©ã«ãã®true
ãªãã·ã§ã³ã䜿çšããŠæ¿èªããããšããå§ãããŸããããã¯ã倧ããªãªãŒããŒãããããªããããã©ã«ãã§ãã¹ãŠã®äººããã®å¯èœæ§ãæå¹ã«ããããã§ãããåºåUnicodeã¯false
ãŸãŸã§ããå¿
èŠããããŸããçæãããããŒãµãŒã®ããã©ãŒãã³ã¹ãåªããŠããããã
ãã®åé¡å
šè¬ïŒããã³ããã©ã«ãã®åºåUnicodeãfalse
ïŒã«é¢ããŠã¯ãUTF-16ã®æ©èœãç解ããããšãç ç²ã«ããŠããã§ã«ææ³ã«Unicodeæåããšã³ã³ãŒãããŠããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ïŒ
// rule matching [\u{1F4AD}-\u{1F4AF}]
my_class = "\uD83D" [\uDCAD-\uDCAF]
// rule matching any Unicode character
my_strict_unicode_dot_rule = $( [\u0000-\uD7FF\uE000-\uFFFF] / [\uD800-\uDBFF] [\uDC00-\uDFFF] )
// rule matching any Unicode character or a lone surrogate
my_loose_unicode_dot_rule = $( [\uD800-\uDBFF] [\uDC00-\uDFFF]? / [\u0000-\uFFFF] )
ãããã£ãŠãè¿ éãªããŒãµãŒãšãææ³ã®ç¹å®ã®éšåã§Unicodeæåãèªèã§ããããšã®äž¡æ¹ãå¿ èŠãªææ³äœæè ã¯ããã®ãããªèŠåã䜿çšã§ããŸãã ãããã£ãŠããã®åé¡ã¯ãUTF-16ã®å éšã«é£ã³èŸŒãããšãªããUnicode管çãåçŽåããããšã ããç®çãšããŠããŸãã
å®è£
ã«ã€ããŠã¯ãæåã®è©Šã¿ã§ãææ³ããã¹ããUnicodeæåã§ãšã³ã³ãŒããããŠãããPEG.jsããŒãµãŒã®ãããããã«ãŒã«ãUnicodeæåãèªèããŠããããšãèæ
®ããŸããã 2çªç®ã®æåŸã®è©Šã¿ã¯ãããå
ã«æ»ãïŒãããã«ãŒã«ã¯åžžã«è§£æãé«éåããããã«1ã³ãŒãåäœã§ãïŒã蚪åè
ã®prepare-unicode-classes.jsã«ã¯ãæåã¯ã©ã¹ã§åå²ãããUnicodeæåãåæ§ç¯ããããã®å°ããªã¢ã«ãŽãªãºã ããããŸãïŒäŸïŒ [\uD83D\uDCAD-\uD83D\uDCAF]
ã¯æ§æçã«[ "\uD83D", [ "\uDCAD", "\uD83D" ], "\uDCAF" ]
ãšããŠèªèããããã®ã¢ã«ãŽãªãºã ã¯ããã[ [ "\uD83D\uDCAD", "\uD83D\uDCAF" ] ]
å€æããŸãïŒã ãããææ³èªäœã«æžãããšãæ³å®ããŠããŸããããé·ããªããããã«éèŠãªããšã«ãæåããšã³ã³ãŒãããæ¹æ³ãè€æ°ããããïŒ "ð¯"ã "uD83DuDCAF"ã "u {1F4AF}"ïŒãæžãããããªããŸããã蚪åè
ã«ã
2åç®ã®è©Šè¡ã§2ã€ã®ãªãã³ãŒããè¿œå ããŸããã
(input.charCodeAt(currPos) & 0xFC00) === 0xD800 && input.length > currPos + 1 && (input.charCodeAt(currPos+1) & 0xFC00) === 0xDC00
classes[c].test(input.substring(currPos, currPos+2)
ã§ã¯ãªãã次ã®2ã€ã®ã³ãŒããŠãããã«äžèŽããŸããACCEPT_N
ã§1ãŸãã¯2ã³ãŒãåäœã«æ¡å€§ãããæåã¯ã©ã¹ã2ã€ã«åå²ãããŸããåºå®é·ã®æ£èŠè¡šçŸïŒ1ãŸãã¯2ã³ãŒãåäœïŒããäžèŽãæ©èœã䜿çšããŠããã€ãã®æé©åãè¡ããçæäžã«ã¢ãŒãïŒUnicodeãã©ããïŒãšæåã¯ã©ã¹ã«å¿ããŠããããã³ãŒãããã¹ãåé€ããŸããã
ãŸãããã®å®è£ ã§ã¯æ£èŠè¡šçŸã¯åžžã«æ£ã§ããããšã«æ³šæããŠãã ãããéæ£èŠè¡šçŸã¯éã®çµæãè¿ãããã€ãã³ãŒãã«ãªããŸãã ããã«ããããµãã²ãŒãåšèŸºã®ãšããžã±ãŒã¹ãåé¿ããã®ãç°¡åã«ãªããŸããã
ç§ã¯ããã€ãã®ããã¥ã¡ã³ããæžããŸããããããããããã«ããã€ãè¿œå ããŸãïŒããããããªãã·ã§ã³ã®ãŠãã³ãŒããšèªå®¶è£œã®Unicodeãããã«ãŒã«ã䜿çšããã¹ããããã®è©³çŽ°ããã°ãã説æããããã®ã¬ã€ãïŒã PRãšããŠæåºããåã«ãã¹ããè¿œå ããŸãã