本当は怖いUTF-16
$ irb
> "𠮷".encode("UTF-8").length
=> 1
> "𠮷".encode("UTF-16").length
=> 2
本当は怖いUTF-16
$ irb
> "𠮷".encode("UTF-8").length
=> 1
> "𠮷".encode("UTF-16").length
=> 2
端末はUTF-8なんだけどnodeがUTF-16に変換してるのかしら
$ node
> "𠮷".length
2
@zundan それも能動的に(寒)
@h12o いyarn
むっちゃ能動的にUTF-8を受け取ってるのかもしれない
$ echo 'console.log("𠮷".length)' | iconv -f utf-8 -t utf-8 | node
2
$ echo 'console.log("𠮷".length)' | iconv -f utf-8 -t utf-16 | node
[stdin]:1
��c
SyntaxError: Invalid or unexpected token
at new Script (node:vm:93:7)
at createScript (node:vm:248:10)
at Object.runInThisContext (node:vm:296:10)
at node:internal/process/execution:83:21
at [stdin]-wrapper:6:24
at runScript (node:internal/process/execution:82:62)
at evalScript (node:internal/process/execution:104:10)
at node:internal/main/eval_stdin:31:5
at Socket.<anonymous> (node:internal/process/execution:205:5)
at Socket.emit (node:events:526:35)
Node.js v20.8.0
@zundan node.jsがソースコードをUTF-8からUTF-16に変換するのはnode.jsの内部仕様で固定っぽいですね。 https://stackoverflow.com/questions/10125141/what-encoding-is-expected-for-node-js-source-code
JavaScriptが文字列を内部で16ビット文字の集合として取り扱う話は https://stackoverflow.com/questions/8715980/javascript-strings-utf-16-vs-ucs-2 で、コメントによるとUTF-16ではない文字列も許容される。 isWellFormed() で判定できる。とのこと
@tateisu なるほどなるほどありがとうございます!OpenPGP.jsなどをいじっていると、他にバイナリの配列もみかけたりで、なかなか奥が深そうです
GNU social JP is a social network, courtesy of GNU social JP管理人. It runs on GNU social, version 2.0.2-dev, available under the GNU Affero General Public License.
All GNU social JP content and data are available under the Creative Commons Attribution 3.0 license.