ãã®å·ã¯ããWebAssemblyãUnicodeãããã³Webãã©ãããã©ãŒã ãã®ãã£ã¹ã«ãã·ã§ã³ã«ä»éãããã®ã§ãã ãã¬ãŒã³ããŒã·ã§ã³ã¯äºåã«èšé²ãããŠããã httpsïŒ//github.com/WebAssembly/meetings/pull/775ã§è©ŠããŠã¿ãããšã«ããŸãã6æ22æ¥ã®CGãããªäŒè°ã«äºå®ãããŠããŸãã
ïŒã¯ãªãã¯ããŠåçïŒ
CGã¡ã³ããŒã®éã§ããç¥ãããŠãããšæãããã³ã³ã»ãããããã€ãæããŸããããããã§ãããããã¯ã«äžæ £ããªäººã«ãšã£ãŠããã¬ãŒã³ããŒã·ã§ã³ã芪ãã¿ããããã®ã«ããããã«ãããããå«ããããšã«ããŸããã ãã£ãŒãããã¯ãæè¿ããŸãïŒ
é¢é£ããåé¡ïŒ
ãããããæ€èšã®ããã«ããããŸã§ãªãã©ã€ã³ãã£ãŒãããã¯ããåéããããã€ãã®æœåšçãªè§£æ±ºçã§ãã
ãã€ã³ã¿ãŒãã§ãŒã¹ã¿ã€ããã§ã以äžãå®çŸ©ããŸãã
string := list char
string16 := list u16
次ã®å Žåã«ããªã³ã¯äžã«é©çšããã匷å¶ãå®çŸ©ããŸãã
| ãã| ã«| æåŸ
| ------------ | ------------ | -------------
| string
| string16
| UTF-8ããUTF-16ã«åãšã³ã³ãŒãããŸã
| string16
| string
| WTF-16ããUTF-8ã«åãšã³ã³ãŒãããŸãïŒçœ®æãªãã·ã§ã³ïŒ
匷å¶ã«ããã string16
ã¢ãžã¥ãŒã«ãWASIãã¹ãã§ããããæ©èœãã string
string16
ã¢ãžã¥ãŒã«ãšstring
å Žåã§ããçžäºã«ã€ã³ã¿ãŒãã§ã€ã¹ã§ããããã«ãªããŸãã string16
ã¢ãžã¥ãŒã«ãŸãã¯ãã¹ãã¯ãåãstring
ãŸãã¯string16
ãšã¯ã¹ããŒããåŒã³åºããŸãããããã§ãªãå Žåã¯ãããŸãã«ãªããŸãã
ããã¯ãŸãã list u16
ãJSã«æž¡ããšUint16Array
ãŸãã¯DOMString
ãªãå¯èœæ§ããããšãããWebåã蟌ã¿ã®ãããŸããããããããŸãã Uint16Array
ããDOMString
Uint16Array
ãžã®JSå
šäœã®åŒ·å¶ã¯æãŸãããªãããã§ããããšã€ãªã¢ã¹string16
ïŒç¬èªã®ãã€ããªIDã string16 :> list u16
æ瀺çã«äœ¿çšããããšã§JSã¿ã€ãã瀺åã§ããŸãã list u16
ã¢ããã¿ã¢ãžã¥ãŒã«ã€ã³ããããã£ãŠããšã€ãªã¢ã¹ã ãã®å Žåã string16
ã¯DOMString
ã list u16
ã¯Uint16Array
ãŸãã
ç§ã¯string16
ãšããååã«ç¹ã«å·çããŠããããã§ã¯ãªããä»ã®ååãããããŸããã解決ããããã«åå/ IDãå¿
èŠãšããªãå¥ã®ååã§ãåé¡ãããŸããã
list.count
ã䜿çšã§ãããããããã§ã¯list.is_canon
ãããªæé©åã¯å¿
èŠãããŸããã ãŸããUTF-anyããã³æœåšçãªLatin1æé©åãžã®æã¯ã以äžã®ããã«ã list.*_canon
ã¢ããã¿ãŒåœä»€ã§å°æ¥ã®ããã«ã¹ããŒã¹ãäºçŽããããšã«ãããéãããŸãŸã«ããããšãã§ããŸãã
ãã€ã³ã¿ãŒãã§ãŒã¹ã¿ã€ããã§ã以äžãå®çŸ©ããŸãã
list.lift_canon $unit [...]
list.is_canon $unit [...]
list.lower_canon $unit [...]
where the $unit immediate is
0: 8-bit (UTF-8, ASCII-compatible)
1: 16-bit (UTF-16)
2: 32-bit (UTF-32)
3: 8-bit (Latin1, narrow UTF-16)
ãã®æœåšçãªè§£æ±ºçã¯ãæŽåœ¢åŒãå¿
èŠãªå Žåã«æ€èšã§ããŸãã ããã«ãããäºéã®åãšã³ã³ãŒãã®ãªãŒããŒããããšã³ãŒããµã€ãºãžã®éæ¥çãªåœ±é¿ãåé¿ã§ããŸããã代çã®åé¡ã¯è§£æ±ºãããŸããã $unit
1-3ã¯ããããªãæé©åãšããŠMVPåŸã«è¿œå ãããå ŽåããããŸãããŸãã¯ããããã®äžéšããããã«éå§ããå ŽåããããŸãã
ãã€ã³ã¿ãŒãã§ãŒã¹ã¿ã€ããã§ã以äžãå®çŸ©ããŸãã
list.lift_canon $unit [...]
list.is_canon $unit [...]
list.lower_canon $unit [...]
where the $unit immediate is
0: 8-bit (WTF-8, ASCII-compatible)
1: 16-bit (WTF-16)
2: 32-bit (Code points except surrogate pairs)
3: 8-bit (Latin1, narrow WTF-16)
ãã®æœåšçãªè§£æ±ºçã§ã¯ã char
ãUnicodeã¹ã«ã©ãŒå€ããUnicodeã³ãŒããã€ã³ãã«åå®çŸ©ããå¿
èŠããããŸããã char
ãªã¹ãã«ãµãã²ãŒããã¢ãå«ãŸããªãããã«å¶éããŸãïŒãã ããåé¢ããããµãã²ãŒããèš±å¯ããŸãïŒã ç¹°ãè¿ããŸãããMVPã®å
·äœçãª$unit
ã¯è°è«ã®äœå°ããããŸãã
ããã¯ããèªäœã§æ倱ããããããã®ã§ã¯ãªããããä»ã®ãã¹ãŠã¯å®éã«MVPåŸã®æé©åã«ãªããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã¿ã€ãã§ã以äžãå®çŸ©ããŸãã
passthrough
ãªãã·ã§ã³ãè¿œå ããŸãã ããã¯ããã¹ã¬ã¹ãã¹ã¹ã«ãŒãå¯èœã«ããæ©èœè¿œå ã§ããããããããšã§ã次ã®ããšãéæãããŸãã
IIUCãæ ¹æ¬çãªåé¡ã¯ãITãæååãUnicodeã³ãŒããã€ã³ãã®ã·ãŒã±ã³ã¹ã«ããããšãæãã§ããããšã§ãããäžéšã®èšèªã§ã¯ãæååãæŽåœ¢åŒã®Unicodeæååã«å¯Ÿå¿ããå Žåãšå¯Ÿå¿ããªãå Žåãããi8ãŸãã¯i16å€ã®ã·ãŒã±ã³ã¹ãšèŠãªããŸãã ç°¡åãªè§£æ±ºçã®1ã€ã¯ãç¡å¹ãªUnicodeæååãåãå
¥ãããŸãã¯çæããèšèª/ APIã§ãæå³ãäŒéããã®ã§ã¯ãªãã (list u8)
ãŸãã¯(list u16)
ïŒããããbyte_string
ãªã©ã®åªãããšã€ãªã¢ã¹ã䜿çšïŒã䜿çšããããšã§ãã IT string
ã¿ã€ããIIRCã¯(list char)
ãšã€ãªã¢ã¹ã§ãã ãããè¡ãããšã®ãã¬ãŒããªãã«ã€ããŠã¯ããŸã ã©ããã§è°è«ãããŠããŸããïŒ
ãã®åé¡ã¯ããå°ã埮åŠãªéãããããšæããŸããITéšéã¯char
ããUnicodeã¹ã«ã©ãŒå€ããšããŠå®çŸ©ãããã®ã§ããããµãã²ãŒãã³ãŒããã€ã³ããããå Žæã«ç©ŽãéããŠãããããå€ç«ãããµãã²ãŒããè¡šãããšã¯ã§ããŸããã ã äžæ¹ãWTFã¯ãã®å¶éã®ãªãããŠãã³ãŒãã³ãŒããã€ã³ããã§ãããã·ãŒã±ã³ã¹ã«ã¯ãµãã²ãŒãã³ãŒããã€ã³ãã®ãã¢ãå«ãŸããªãããã«å¶éãããŠããŸãïŒãããã¯è£è¶³ã³ãŒããã€ã³ã> U + FFFFã«çœ®ãæããããŸãããåé¢ããããµãã²ãŒãã¯åé¡ãããŸããïŒã ããã¯ããªããæå³ããããšã§ããïŒ
ãã以å€ã¯ã const char*
æç¹ã§Cã®ãããªãã€ãæååã¯ãŸã è°è«ãããŠããªããšæããŸãã ããããç§ã¯ãããèŠéãããããããŸããã
ç°¡åãªè§£æ±ºçã®1ã€ã¯ãç¡å¹ãªUnicodeæååãåãå ¥ãããŸãã¯çæããèšèª/ APIã§ãæå³ãäŒéããã®ã§ã¯ãªãã
(list u8)
ãŸãã¯(list u16)
ïŒããããbyte_string
ãªã©ã®åªãããšã€ãªã¢ã¹ã䜿çšïŒã䜿çšããããšã§ãã ITstring
ã¿ã€ããIIRCã¯(list char)
ãšã€ãªã¢ã¹ã§ãã
ããã¯çŸåšç§ã®å¥œã¿ã®è§£æ±ºçã§ããããŸã- string
ãçŸåš(list char)
ãšã€ãªã¢ã¹ãšããŠå®çŸ©ãããŠããã®ãšåãããã«ã wtf16string
ã¿ã€ãã¯(list u16)
ã®ãšã€ãªã¢ã¹ã«ãªããŸã(list char)
ã ãšã€ãªã¢ã¹IIUCã®å€ã¯ãïŒããšãã°ïŒJSã«ãã£ãŠåŒã³åºããã(list u16)
è¿ãé¢æ°ã®çµæãïŒæ°å€ã®ïŒJSãªã¹ããšããŠè¡šç€ºãããã®ã«å¯Ÿãã wtf16string
è¿ãé¢æ°ã®çµæã§ãã
ãã©ããã®æ£èŠABIã«wtf16string
ãšã€ãªã¢ã¹ãè¿œå ããããšã¯ãæ¯èŒçéªéã«ãªããªãããã§ãã
äžæ¹ãWTFã¯ãã®å¶éã®ãªãããŠãã³ãŒãã³ãŒããã€ã³ããã§ãããã·ãŒã±ã³ã¹ã«ã¯ãµãã²ãŒãã³ãŒããã€ã³ãã®ãã¢ãå«ãŸããªãããã«å¶éãããŠããŸãïŒãããã¯è£è¶³ã³ãŒããã€ã³ã> U + FFFFã«çœ®ãæããããŸãããåé¢ããããµãã²ãŒãã¯åé¡ãããŸããïŒã
ãããããã¯ããã®è¿œå å¶éããããããWTF-8ããã¬ãŒã³ãª(list u16)
ãšåãã§ã¯ãªãããšãæå³ããŸããïŒ ç§ã¯ãã®ãã¥ã¢ã³ã¹ãç解ããŠããŸããã§ããã ç§ã®çŽæã§ã¯ãããã¯äž¡æ¹æã£ãŠããéãã ãããšããããšã§ãstring
æŽåœ¢ãŠãã³ãŒãã¹ã«ã©å€ã®é
åãªãã³ã«è¡šçŸåwtf16string
ã»ãšãã©ã§ããã¿ã€ã(list u16)
ããè¿œå ã®å¶éããããŸãã ç¡å¶éã®(list u16)
ãšã€ãªã¢ã¹ã䜿çšãããšãUnicodeã®æŽåœ¢åŒæ§ã匷å¶ããªãã·ã¹ãã ã§ååã«æ©èœããŸããïŒ WTF-8ä»æ§ã®ãã®æ³šèšã¯ããããªãããšã瀺åããŠããŸãã
ãããããã¯ããã®è¿œå å¶éããããããWTF-8ããã¬ãŒã³ïŒãªã¹ãu16ïŒãšåãã§ã¯ãªãããšãæå³ããŸããïŒ
ãUTF-8ãUTF-16ãšäžèŽããããã«Unicodeããã¹ãã«äººçºçã«å¶éãããŠããããã«ãWTF-8ã¯ãæœåšçã«äžæ£ãªåœ¢åŒã®UTF-16ãšäžèŽããããã«ä»£çã³ãŒããã€ã³ããã¢ãé€å€ããããã«äººçºçã«å¶éãããŠããŸããã Iiucã¯ãUTF-8ãé·ããããã€ãã·ãŒã±ã³ã¹ãŸãã¯åãæšãŠããããã€ãã·ãŒã±ã³ã¹ãåŠçããæ¹æ³ãšåæ§ã«ããããåŠçããŸãã WTF-8ã¯ä»»æã®(list u16)
ãè¡šãããšãã§ããŸããããã¹ãŠã®(list u8)
ãæå¹ãªWTF-8ã§ãããšã¯éããŸããã
ç¡å¶éïŒãªã¹ãu16ïŒã®ãšã€ãªã¢ã¹ã䜿çšãããšãUnicodeã®æŽåœ¢åŒæ§ã匷å¶ããªãã·ã¹ãã ã§ååã«æ©èœããŸããïŒ
WTF-16ã¯1ïŒ1ãã©ã³ãã ãªu16
å€ã«ããããããããã®å€ãã©ã®ããã«è§£éããããã«äŸåãããããã¯ãã (list u16)
ã¯æ©èœããŸãã
IIUCãWTF-8ã¯ãä»»æã®list u8
ãšãŸã£ããåãã§ã¯ãããŸããã ããšãã°ãããµãã²ãŒããã¢ãã€ãã·ãŒã±ã³ã¹ãã¯çŠæ¢ãããŠããŸãïŒãããåç
§ïŒã
ãã ããWTF-16ã¯list u16
ãšåãã§ãã 圌ããããŒãã³ã°ããŒããå
±æããŠããã®ã¯å°ãå¥åŠã§ãã
ç·šéïŒæŽæ°ããå¿ èŠããããŸã:)
interface-types /ïŒ135ã®ãµãã²ãŒãã®è³ªåã ãã«çŠç¹ãåœãŠãæåã®è³ªå/åçãæçš¿ããŸããã ãããäžäœãããã ãšæããŸããããã«åæã§ããã°ã1ã€ä»¥äžã®ãšã³ã³ãŒã圢åŒã®ãµããŒãã«é¢ãããã®åŸã®èª¬æãç°¡åã«ãªããŸãã
ããããšããã«ãŒã¯ã
äžèšã®ãSeparateWTF-16ãããµããŒãããå ŽåïŒWASI APIãžã®ã¢ã¯ã»ã¹ãæå¹ã«ããã°ã«ãŒã³ãŒããªãã§JavaScriptãšã€ã³ã¿ãŒãã§ã€ã¹ããããã«ã¯åŒ·å¶ãéèŠã§ãïŒãææ¡ãããchar
æºè¶³ã
ãµãã²ãŒãã§ææ¡ããŠããããã«å¥ã®string16
ã¿ã€ãã䜿çšãããšã interface-types /ïŒ135ã§æŠèª¬ãããŠãããµãã²ãŒãã«é¢ãããã¹ãŠã®åé¡ãçºçããããã2ã€ã®æååã¿ã€ãã䜿çšããæ¹ãè¯ããšã¯æããŸããã .1ã€ïŒç¹ã«ããããæé»çã«çžäºå€æå¯èœã§ããå Žå;ãããã¯æå³ã®ããå¥ã
ã®åã§ã¯ãããŸããïŒã 2ã€ã®æååã¿ã€ãããããšããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹èšèšè
ãšæ¶è²»è
ã«ç²Ÿç¥çãªè² æ
ãããããããäºæ
ã¯ããã«æªåããŸãïŒããªãã2ã€ã®ã¿ã€ããããã®ãââãéãã¯äœã§ããïŒã©ã¡ãããã€äœ¿çšããå¿
èŠãããã®ã§ããïŒãïŒã æåŸã«ãWTF-16ã®ãµããŒããè¿œå ãããšãäžè¬ã«ã interface-types /ïŒ135ã§ãèšåãããŠããå°æ¥ã®æšæºé²åã¬ã€ãã³ã¹Web / IETFã«åã
Webå°çšã®ãŠãŒã¹ã±ãŒã¹ã®å ŽåãJSãŸãã¯WebAPIã®åé¡ã解決ããããšã¯çã«ããªã£ãŠãããšæããŸãã ããšãã°ãwasmã®ã€ã³ããŒããšãšã¯ã¹ããŒããããã€ã³ããããããã®JSAPIãæ³åããã®ã¯ç°¡åã§ãã ããã¯ãã¹ã¿ãã¯ã¹ã€ããã³ã°ãªã©ã®ä»ã®æ°ããJS APIã§ãã§ã«æ¡çšãããŠããã¢ãããŒãã§ãããWebãåŠçã§ããäžè¬çãªããã€ã³ãã€ã³ããŒãã/ããã€ã³ããšã¯ã¹ããŒããJSAPIãã©ãã«è¡ãã®ãçåã«æã£ãŠããŸããã -PromisesãJSæååãããã³åä»ãé åãã¥ãŒã®ç¹å®ã®ã±ãŒã¹ã
ãµãã²ãŒãã§ææ¡ããŠãããããªå¥ã®string16ã¿ã€ãããããšãinterface-types / 135ã§æŠèª¬ãããŠãããµãã²ãŒãã«é¢ãããã¹ãŠã®åé¡ãçºçããŸãã
æè¡çã«ã¯æ£ããã§ãããæååã¯ãã€ã³ã¿ãŒãã§ãŒã¹ããŠããã¢ãžã¥ãŒã«ã®çš®é¡ã«ã€ããŠã®äºåã®ç¥èããªããŠããå°ãªããšãåžžã«åãèšèªãäºææ§ã®ããèšèªãããã³JavaScriptã§å¥ã
ã«ã³ã³ãã€ã«ãããã¢ãžã¥ãŒã«éã§æ©èœããããšãèŠéããŠããŸãã ããã¯éåžžãç§ãæãã±ãŒã¹ã®å€§éšåã§ãã ãã®ãããç§ã«ã¯åŠ¥åœãªåŠ¥åæ¡ã®ããã«æããŸãããŸããå¿
èŠãªchar
å€ã®ç¯å²ãæŽåœ¢åŒïŒUSVïŒã®æååå°çšã«ããããšãã§ããããã§ãã
2ã€ã®æååã¿ã€ãããããšããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ãã¶ã€ããŒãšã³ã³ã·ã¥ãŒããŒã«ç²Ÿç¥çãªè² æ ãããããããäºæ ã¯ããã«æªåããŸãïŒã2ã€ã®ã¿ã€ããããã®ã¯ãªãã§ããïŒéãã¯äœã§ããïŒã©ã¡ãããã€äœ¿çšããå¿ èŠããããŸããïŒãïŒ
ææã®ç Žæã®ä»£æ¿æ¡ã¯ç§ã«ã¯ã¯ããã«æªãããã«æãããã®ã§ããããå¿
èŠãªå Žåã¯ãã»ãšãã©ã®äººãããã§å€§äžå€«ã ãšæããŸãã ããããããã®å°ããªåé¡ã軜æžããã«ã¯ã2çªç®ã®æåååïŒ domstring
ïŒïŒã®é©åãªååã§ååã§ãã
æåŸã«ãWTF-16ã®ãµããŒããè¿œå ãããšãéåžžãå°æ¥ã®æšæºé²åã¬ã€ãã³ã¹Web / IETFã«åããŸãã
æ®å¿µãªããã圱é¿ãåããèšèªã®ãšã¹ã±ãŒããããããªãå ŽåãIT MVPã誰ãã®ããã«ã©ããã§äœããå£ããã»ãšãã©åœ¹ã«ç«ããªãéãã誰ãã䞻匵ããåŸåãã©ã®ããã«æšè«ãããã¯ç§ã«ã¯ããŸãéèŠã§ã¯ãããŸããç§ãåãçµãã§ããJavaScriptã®ãããªèšèªã®å Žåãç§ã¯ããã«å察ããããšããã§ããŸããã
ã§ããããç§ã¯èª°ããäžç·ã«æ®ãããåççãªè§£æ±ºçã劥åç¹ãèŠã€ããããšããŠããŸããç§ãã¡ãååã§ããã°å¹žãã§ãã
ããªãã®èšã£ãŠããããšãã interface-types /ïŒ135ã§çºçããåé¡ã«ã©ã®ããã«å¯ŸåŠããŠãããããŸãã¯æ°ããdomstring
ã¿ã€ããå«ããªããšITãäžè¬çã«å®è¡å¯èœåŒ·åãªã¬ã€ãã³ã¹ã«å¯Ÿæããã«ã¯ãããå€ãã®çµéšã«åºã¥ã蚌æ ãå¿
èŠã ãšæããŸãã
ïŒç§ãã¡ã¯ãµãã²ãŒãã®äžåšã«åæã§ããå ŽåFWIWã¯ãç§ã¯ãããã®æ£èŠã®ABIã§è¿œå ã®ãšã³ã³ãŒãã£ã³ã°ãšããŠU TF-16ãæ¯æã«ã€ããŠè©±ãããæå³ã«ãªãã ãããšæããŸãstring
ãããããããã¯ãšå
šäœã®å¥ã®ãããã¯ã§ãããã€ãã®ãªãã·ã§ã³ãããã®ã§ãæåã«ç解ããå¿
èŠã®ããæœè±¡çãªæååã®ã»ãã³ãã£ã¯ã¹ãšæ··åããããããŸãããïŒ
ç§ã¯ããªãã®2çªç®ã®æ®µèœã«æè¬ããŸããããã¯ãã§ã«ããã€ãã®éåžžã«åä»ãªåé¡ã解決ããã§ãããã UTF-16ã®ãµããŒããåå¥ã«åœ¹ç«ã€ããšã«åæãã説æè / MVPã«è¿œå ããŠããã ããã°å¹žãã§ãã ç§ãæ°ããŠãã ããïŒ
ããããç§ã¯æåã®æ®µèœã§ããªãã®è°è«ã«åŸãã®ã«èŠåŽããŠããŸãã ããããããªããç§ãä¿¡ããŠããªãã®ãªããããã«Linus TorvaldsããLinuxã«ãŒãã«ãè¶ ããŠæ¡åŒµãããšç§ãæãéåžžã«éèŠãªã«ãŒã«ã説æããŠããŸãïŒããã人ã ãäŸåãããã°ã§ããå Žåãããã¯ãã°ã§ã¯ãªããæ©èœã§ãããç¶è¡ããã ãã§ãã
ã·ã¹ãã å šäœã®äžã§æãã³ã¢ãªã©ã€ãã©ãªããç©äºããæ¹åããããABIããä¿®æ£ããããéããåé¡ãçºçããŠãåé¡ããªãã®ã¯æ¬åœã«æ²ããããšã§ãã
ãããŠããµãã²ãŒãã«ã€ããŠå¿é
ããå¿
èŠããªãããšã¯ç¢ºãã«äžçš®ã®æ©èœã§ããããŠãŒã¶ãŒã¯ãã¡ãã¡ã§äžæ³šæãªsubstring(0, 1)
å®è¡ããŠã€ã³ããŒããããé¢æ°ãåŒã³åºãããšãã§ããŸãããŸãã¯ã split("")
ãæž¡ããŠãããäžåºŠjoin()
äœæãããã StringBuilder
ãã¢ãžã¥ãŒã«ãšããŠäœæããŸããããã«ãããéæ³ã®ããã«äºé眮ææåãçæãããããšã¯ãããŸããã ã€ãŸããéåžžã«äººæ°ã®ããå€ãã®èšèªãæŽåœ¢åŒã®åŒ·å¶ã«å察ããçç±ããããWasmããããã®èšèªãšãã®ãŠãŒã¶ãŒãé©åã«ãµããŒããããå ŽåãWasmãã¢ãžã¥ãŒã«åãããã»ã©ãå¢çã倧ãããªããŸããé¢æ°ãã©ã®ã¢ãžã¥ãŒã«ã«ååšããããå€æããã®ãé£ãããªããåé¡ãããæããã«ãªããŸãã
çŸåšã®çŸå®ãç¡èŠããæ¹æ³ã§äœããèšèšããããšãæªãèãã§ããããšã蚌æããããã«ã©ãã ãå€ãã®èšŒæ ãå¿ èŠããç§ã¯æ¬åœã«ç¥ããŸããã å®éãããã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã§ã®ã¿åé¡ãªãããã§ãããä»ã®ãã¹ãŠã®ææ¡ã¯éåžžã«é«ãæ°Žæºã«ä¿ãããŠããŸãã ç§ã¯ããã«é¢ããå°é家ã§ã¯ãããŸããããUSVã䞻匵ããããšã«ãã£ãŠUCS-2èšèªã®ããŒãºã«é¢ããŠãããšãŸã£ããåãééããç¯ããã®ã¯ãUnicodeæšæºèªäœã§ãããçŽ10幎åã®åæ§ã«çµ¶æçãªçµæã«ã€ãªãã£ããšæããŸããè°è«ïŒã¹ã¬ããå šäœãæšå¥šã§ããŸãããç¹ã«æ²é»ããåã®æåŸã®ã³ã¡ã³ãïŒã¯ã2014幎ã«ãWTF-8ãšã³ã³ãŒãã£ã³ã°ã§ããäžè¬çã«é©çšãããå®çšçãªãœãªã¥ãŒã·ã§ã³ã®èª¬æã§æé«æœ®ã«éããŸããã
ãããã¹ããªãŒã ã§æåãšã³ã³ãŒããšã©ãŒãçºçãããšãã«çœ®ææåãçºè¡ããããšã¯ãå±éºãªãµã€ã¬ã³ãããŒã¿ã®ç Žæã®ããç¥ããã圢åŒã§ãããæŽåæ§ãå¿ èŠãšããã·ã¹ãã ã¯ãããçŠæ¢ããŠããããšã«æ³šæããŠãã ããã
é¢é£ããŠãcodePointAtãåç¬ã®ãµãã²ãŒããããããããšãã«äŸå€ãã¹ããŒããå Žåã誰ãã誀ã£ãŠããŒã¿ããŒã¹å ã®æååã®ééã£ãäœçœ®ã«çµµæåãé 眮ããããã«ãã¢ããªã±ãŒã·ã§ã³å šäœãå£ããã°ãçºçããå¯èœæ§ããããŸãã
æ®å¿µãªãããecmascriptã䜿çšãããšããã¢ã«ãªã£ãŠããªã代çã³ãŒããã€ã³ããå«ãæååãçæããªãããã«ããããšãéåžžã«å°é£ã«ãªããŸããæååããæåã®157 .lengthåäœãååŸããã...ããè¿œå ããŠççž®ããã®ãšåããããç°¡åã§ãã ãŸããBMP以å€ã®ãã£ã©ã¯ã¿ãŒã¯ãŸãã§ãããããå®éã«ãããå®éã«çºçããå Žåãããã¯ç°åžžãªäºæ ã§ãã Unicodeã®è¡çç¶æ ãæ¹åããããšãæåŸ ããŠãå±éºãå°å ¥ããããšã«ã¯éåžžã«æ¶æ¥µçã§ãã
JSãJavaãCïŒãæååãæã£ãŠããçç±ã¯ãUnicodeã2ãã€ãã§ã¯äžååã§ãããUCS-2ãå®è¡å¯èœã§ã¯ãªãããšã«æ°ä»ãããšããŸã§ã«ã倧éã®ã³ãŒãããã§ã«èšè¿°ãããŠããããããããã®èšèªã¯åçŽã«èšè¿°ããŠããªãã£ãããã§ããéžæè¢ã¯ãããŸããã åæ§ã«ããŠãŒã¶ãŒã¹ããŒã¹ã«å ¬éãããŠããLinuxã·ã¹ãã ã³ãŒã«ã®å Žåã å¯Ÿç §çã«ãITã§å®çŸ©ãããAPIã䜿çšããã³ãŒãã¯çŸåšååšããªããããåãäžäœäºææ§èŠä»¶ã¯ãããŸããã å€ãã®çç±ã§ãwasmããã³Interface Typesã¯ãæ¢åã®åäžèšèªãŸãã¯syscallABIãå®å šã«ãšãã¥ã¬ãŒãããããšæå³çã«ã¯ããŠ
ãã¡ãããã³ã³ããŒãã³ãå ã§ã¯ãæååã¯èšèªã«é©ããæ¹æ³ã§è¡šçŸã§ããããšã匷調ãããã®ã§ãå®éã«ã¯APIã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠã®ã¿èª¬æã
ãããã£ãŠããããã®WTF-16æååã»ãã³ãã£ã¯ã¹ãåŒãç¶ããªããã°ITãå®è¡å¯èœã§ã¯ãªãããšã瀺åãã蚌æ ã¯ãŸã ãªããšæããŸããããã¯ãMVPã«ãšã£ãŠé©åãªè³ªåã ãšæããŸãã
ç§ãåæããªãããã€ãã®ç¹ïŒ
ããªãã®èšã£ãŠããããšãinterface-types /ïŒ135ã§çºçããåé¡ã«ã©ã®ããã«å¯ŸåŠããŠãããããããŸãã
ããã¯çŸåšå¥ã®åé¡ã§ãããç§ãæ倱ã解決ããããã®åççãªåŠ¥åæ¡ã§ãããšç§ãä¿¡ããŠããããšã«ã€ããŠè©±ãåã®æçš¿ã§ã ç¹ã«ãå¥ã®åé¡ã§ããªãã®æšè«ã«åé¡ã¯ãããŸãããããã¹ã¬ã¹ãã©ãŒã«ããã¯ãå©çšå¯èœãªå Žåã«éããŸãã ããã¯ã©ã¡ãã/ãŸãã¯ç§ã®æèŠã§ã¯ãããŸããã ããã§ãªãå Žåã¯ãWTF-8 / 16ãããå æ¬çã§å¶éã®å°ãªãéžæè¢ã§ãããWasmã®é«ã¬ãã«ã®ç®æšã®1ã€ãWebãã©ãããã©ãŒã ãšã·ãŒã ã¬ã¹ã«çµ±åããããšã§ãããããããäžäœãç¶æããããšã§ãããããç§ã¯æèŠãæ®ããŸãã -Webã®äºææ§ãããã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã«ãé©çšãããŸãã
æ¢åã®JSAPIã¯ãå¢çã§ä»»æã®å€ã®å€æãè¡ãããã®æ±çšãšã¹ã±ãŒããããããã§ã«æäŸããŠããããããã®åæã®æç¹ã§2çªç®ã®ãšã¹ã±ãŒãããããã©ã®ããã«å¿ èŠãã¯ããããŸããã
ã«ã¹ã¿ã JSAPIãã€ã³ãã£ã³ã°ã䜿çšãããšã¹ã±ãŒããããã¯åžžã«ãããŸã
æ®å¿µãªãããããã¯ç§ãã¡ã®å Žåã«ã¯ååã§ã¯ãããŸãããçŸåšã次ã®ãããªã°ã«ãŒã³ãŒãããããŸãã
const STRING_SMALLSIZE = 192; // break-even point in V8
const STRING_CHUNKSIZE = 1024; // mitigate stack overflow
const utf16 = new TextDecoder("utf-16le", { fatal: true }); // != wtf16
/** Gets a string from memory. */
function getStringImpl(buffer, ptr) {
let len = new Uint32Array(buffer)[ptr + SIZE_OFFSET >>> 2] >>> 1;
const wtf16 = new Uint16Array(buffer, ptr, len);
if (len <= STRING_SMALLSIZE) return String.fromCharCode(...wtf16);
try {
return utf16.decode(wtf16);
} catch {
let str = "", off = 0;
while (len - off > STRING_CHUNKSIZE) {
str += String.fromCharCode(...wtf16.subarray(off, off += STRING_CHUNKSIZE));
}
return str + String.fromCharCode(...wtf16.subarray(off));
}
}
ãŸããChromeãšNode.jsãéèŠããŠãããããUTF-16LEçšã®V8ã®TextDecoder
ã¯ãä»ã®ãšã³ãžã³ãããã¯ããã«é
ãããšãããããŸããïŒSMã¯éåžžã«é«éã§ãïŒããããã£ãŠã String.fromCharCode
ã¯å®éã«ã¯ãV8ã§ã¯ç¹å®ã®æçåå²ç¹ãŸã§é«éã§ãã ããã§ãä»ã®ãšãããããäžå¿ã«æé©åããããšã«ããŸããã 次ã«ãWTF-16ã«ã¯TextDecoder
ãååšããªãããïŒããã¯åå¥ã«ç
©ãããïŒãæåã«æŽåœ¢åŒã®UTF-16ããã³ãŒãããããšããŸããããã倱æããå Žåã¯ãã¹ããŒããŠãã£ã³ã¯ã¹ã«ãŒã«ãã©ãŒã«ããã¯ããŸããã¯ããã«é
ãString.fromCharCode
ã ã¹ã¿ãã¯ããªãŒããŒãããŒãããå¯èœæ§ããããããé·ãæååã«String.fromCharCode
ãåçŽã«é©çšããããšã¯ã§ããªãããããã£ã³ã¯åãå¿
èŠã§ãã
äžæ¹ãããšãã°Rustã¯ãããå¿
èŠãšããªãã§ããããããããçŸåšã®ITãæ¬æ¥ããã¹ãã»ã©äžç«ã§ã¯ãªããšç§ãèããçç±ã®1ã€ã§ãã äžè¬çã«ãIT string
ã®ãã€ã³ãã¯ã確ãã«JSãšããŸãã€ã³ã¿ãŒãã§ãŒã¹ã§ããããšã ãšæããŸããããã¯ãäŸç¶ãšããŠç§ãã¡ã®äž»èŠãªçžäºéçšã¿ãŒã²ããã§ãã
çŸåšãITã§å®çŸ©ãããAPIã䜿çšããã³ãŒãã¯ååšããªããããåãäžäœäºææ§èŠä»¶ã¯ãããŸããã
ITã¯ãŸã ååšããªããããååã¯æè¡çã«ã¯çå®ã§ãããIIUCã®èŠä»¶ã«ã¯ãããšãã°äžèšã®ã°ã«ãŒã³ãŒãã®äžåšçšãªãã£ã³ã¯ã®èª¬æãªã©ãæ¢åã®ãŠãŒã¹ã±ãŒã¹ã®æ¹åãå«ãŸããŸãã ã§ããã ãå€ãã®èšèªã«çæ³çã§ããããããã¬ãŒã³ããŒã·ã§ã³ã§è¿°ã¹ãããã«ããã¹ãMVPã¯ç¢ºãã«ãåãªãæé©åãã«ãªããŸãã ããã©ããããä»ã®ãšããITã¯åºæ¬çã«ãUTF-8ãšã³ã³ãŒããŒ/ãã³ãŒããŒãå©çšã§ããèšèªã®æé©åã§ãããã®ããå§ãŸããŸãããããã¯äžç«ã§ã¯ãªããšæããŸãã
wasmããã³InterfaceTypesã¯ãæ¢åã®åäžèšèªãŸãã¯syscallABIãå®å šã«ãšãã¥ã¬ãŒãããããšæå³çã«ã¯ããŠããŸããã
ç§ã¯ãããç§ããã®æèŠã§ãããã®ããã«èªã¿ãŸããããç§ã¯ãŸã£ããããã§ã¯ãããŸããã ç§ã¯ããã§çãã®æ©æµãããªãã«äžããã€ããã§ãããç§ã®æèŠã§ã¯ãITã¯çŸåšäžå¿ èŠã«å¶éãããŠããããã®ããéåžžã«ç¹å®ã®èšèªã®ã»ããã«ããããŸãæ©èœããªãããšãä»ãå ããããšæããŸãã ããã©ããããWTF-8 / 16ã¯ãJSæååã«ã©ãŠã³ãããªãããããããè«ççãªããã©ã«ãã«ãªããšç§ãäºæ³ããŠããããå æ¬çãªãšã³ã³ãŒãã£ã³ã°ã§ãã ããã§ã¯åæããŸããããé©åãªãšã¹ã±ãŒããããããªãå Žåã«éããŸãã å®è¡å¯èœãªãã¹ã¬ã¹ã®ä»£æ¿æ段ãååšãã誰ãå£ãããäžå¿ èŠã«äžå©ã«ãªã£ããããªãå Žåã¯ãããã©ã«ãã®æååã¿ã€ãã®æšè«ã§åé¡ãããŸããã
ãµãã²ãŒããæž¡ãå¿ èŠããªãïŒãããŠå€ãã®å Žåæå³ããªãïŒãšä¿¡ããçç±ã¯ãããããããŸã
ããã§ã¯åæããŸããã ç¹ã«ãç§ã®ãã¬ãŒã³ããŒã·ã§ã³ãã³ã¡ã³ãã¯ããŸãã§ã¯ããããéåžžã«æå³ã®ãããã®ã«ãªãå¯èœæ§ããããšããåççãªçãã瀺ããŠãããšæããŸãïŒæŽåæ§ãå¿ èŠãªå Žåãªã©ïŒã Unicodeã®è¡çç¶æ ãæ¹åããããšãæãã§ããå±éºãã ã€ãŸããå¯èœã§ããã°ãJava / CïŒ/ AS <-> JSãJava / CïŒ/ AS <->ã®éèŠãªå Žåã«ãæ©èœããããšãä¿èšŒãããŠããæ¹æ³ã§ãæ£èŠã®ABIãèšèšããå¿ èŠããããšæããŸãã Java / CïŒ/ ASã ä»ã®ãã¹ã§ã®çœ®ãæãã¯ããããé¿ããããŸããããå°ãªããšãèšèªãšãŠãŒã¶ãŒã«ã¯éžæè¢ãããããŸãã«ããã©ã«ãããŸã ç ŽãããŠããªãå ŽåããããŸãã
ãããã®WTF-16æååã»ãã³ãã£ã¯ã¹ãåŒãç¶ãããšãªãã«ITãå®è¡å¯èœã§ã¯ãªãããšã瀺åãã蚌æ ã¯ãŸã ãªããšæããŸã
åççãªçãããããåççãªåŠ¥åæ¡ã§ãããšç§ãä¿¡ããŠããããšãæ¢æ±ããæ欲ããªãå Žåãç«èšŒè²¬ä»»ã¯ããªãã«ãããšæããŸãã ç¹°ãè¿ãã«ãªããŸãããç§ã¯ããã©ã«ãã®æååãããªããšæŽåœ¢åŒã®æªæ¥ã«ä»»ããããšæã£ãŠããŸããããŸãã§ã¯ãããããã§ãå±éºãèæ ®ããªããšããç ç²ãæãããšã¯ãããŸããã å€ãã®äººæ°ã®ããèšèªã¯ããã«ãã£ãŠåœ±é¿ãåããå¯èœæ§ããããããããèªèããããšãå°æ¥çã«ãããæ£åœåããã®ã¯éåžžã«å°é£ã«ãªãå¯èœæ§ããããŸãã
JSã°ã«ãŒã³ãŒãã¯çæ³çã§ã¯ãªãããšã«åæããŸããããã®æ£ããä¿®æ£ã¯JS APIãŸãã¯JSã«ãããå°æ¥ã®ã³ã³ããŒãã³ããšã³ã·ã¹ãã å šäœã«wtf-16-stringã®æŠå¿µãè¿œå ããããšã§ã¯ãªããšæããŸãã ãããè¶ ããŠããŸã å¿çãããŠããªãå¿çããæ°ããæ å ±ã¯è¡šç€ºãããŸããã ç®æš/ç¯å²ã®è³ªåã«ã€ããŠã¯ã»ãšãã©æèŠãåãããŠããããã§ãã
TextDecoder
ç°åžžã¯ãJSã§ä¿®æ£ããã®ãããã«é£ãããšæããŸããããã¯ããããç¯å²å€ã§ãããšãã§ã«å€æãããŠããããã§ãã JSã®TextDecoder
ã¯ã2ã€ã®é¢æ°åŒã³åºãã®éã«åŒã³åºããããã®ã§ã¯ãªããäž»ã«ãããã¯ãŒã¯çµç±ãŸãã¯ã¹ãã¬ãŒãžããããŒã¿ãååŸããããã«äœ¿çšããããããJSã¯ãããè¡ãããšãã§ããŸãã
ããã«èå³æ·±ãç°åžžããããã«ããªãããšããããããã§ããTextEncoder
UTF-16LEã®ããã«ããã®1ãé¢ä¿ããŠããŸãã
/** Allocates a new string in the module's memory and returns its pointer. */
function __newString(str) {
if (str == null) return 0;
const length = str.length;
const ptr = __new(length << 1, STRING_ID);
const U16 = new Uint16Array(memory.buffer);
for (var i = 0, p = ptr >>> 1; i < length; ++i) U16[p + i] = str.charCodeAt(i);
return ptr;
}
ã芧ã®ãšãããããã¯JavaãCïŒãASãªã©ã®äž»èŠãªåé¡ç¹ã§ããã list u16
ãæž¡ãããå Žåã§ãããããã®äž¡æ¹ãå¿
èŠã«ãªããŸãã ãããŠããã®åé¡ã®ã³ã³ããã¹ãã§ã¯ãåãèšèªã®2ã€ã®ã¢ãžã¥ãŒã«éã®äºéã®åãšã³ã³ãŒã+æ倱ã¯ããã»ã©å€ãããªããšããç¹ã§ãJSAPIã«éå®ãããŸãã:(
Webã§ãã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸåŠããæ¹æ³ã«ã€ããŠã¯ã TextEncoder
/ TextDecoder
以å€ã«ãããŸããŸãªãªãã·ã§ã³ããããŸãã ãã1ã€ã¯ã new WebAssembly.Function()
ïŒäžéšã®ãã©ãŠã¶ãŒã§æ¢ã«å®è£
ãããŠããŸãïŒãæ¡åŒµããŠãã³ã³ã¹ãã©ã¯ã¿ãŒã«ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãè¿œå ããããšã§æååå€æãå®è¡ããããšã§ãã ãã®ãããªã¢ãããŒãã«ãããã³ã³ããŒãã³ã以å€ã®wasmã®äœ¿çšã«ãæ©èœãå©çšã§ããããã«ãªãïŒå Žåã«ãã£ãŠã¯ã¯ããã«æ©ãïŒãJSAPIããã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸåŠããã®ã«é©åãªå Žæã«ãªããšããç¹ã匷調ãããŸãã
åèïŒhttpsïŒ //github.com/WebAssembly/interface-types/issues/135#issuecomment-863493832ã§åºãŠãããIntegratedW / UTF-anyããªãã·ã§ã³ãäžèšã®ææ¡ã®
æãåèã«ãªãã³ã¡ã³ã
ããã¯çŸåšç§ã®å¥œã¿ã®è§£æ±ºçã§ããããŸã-
string
ãçŸåš(list char)
ãšã€ãªã¢ã¹ãšããŠå®çŸ©ãããŠããã®ãšåãããã«ãwtf16string
ã¿ã€ãã¯(list u16)
ã®ãšã€ãªã¢ã¹ã«ãªããŸã(list char)
ã ãšã€ãªã¢ã¹IIUCã®å€ã¯ãïŒããšãã°ïŒJSã«ãã£ãŠåŒã³åºããã(list u16)
è¿ãé¢æ°ã®çµæãïŒæ°å€ã®ïŒJSãªã¹ããšããŠè¡šç€ºãããã®ã«å¯Ÿããwtf16string
è¿ãé¢æ°ã®çµæã§ãããã©ããã®æ£èŠABIã«
wtf16string
ãšã€ãªã¢ã¹ãè¿œå ããããšã¯ãæ¯èŒçéªéã«ãªããªãããã§ãã