ruby.social is one of the many independent Mastodon servers you can use to participate in the fediverse.
If you are interested in the Ruby programming language, come join us! Tell us about yourself when signing up. If you just want to join Mastodon, another server will be a better place for you.

Administered by:

Server stats:

1.1K
active users

𠮷野家さんはUTF-16で4文字わよ

$ ruby -e 'puts "𠮷野家".encode("UTF-8").size'
3
$ ruby -e 'puts "𠮷野家".encode("UTF-16").size'
4

@zundan 正確には4コードユニットでしょうか。というのは置いておいて最近のRubyだと10が返ってくるみたいですね

@shugo 不正確な書き方になっているのは某Salesforceのデータベースへの不満の表れなので置いておいて、ほんとうだ! 3.4.2でUTF-16に対しては10が返りますね。BOMと4コードユニットそれぞれ2バイトずつ合計10バイトでしょうか。UTF-8では3のままなのに対してちょっと非直感的に感じてしまいます。

$ ruby -e 'puts RUBY_VERSION;x="𠮷野家";[8,16].each{puts x.encode("UTF-#{it}").s
ize}'
3.4.2
3
10

@zundan UTF-16はダミーエンコーディングなので、中途半端にコードユニットに対応するよりバイト列扱いにしたんですかねえ

@shugo なるほどなるほど。Encoding::UTF_16BEやEncoding::UTF_16LEでencodeした場合にはsizeは3になるようです。UTF-16でサロゲートペアになる文字を簡単に知ることができて便利だったのですが、他の方法を探しますw

Shugo Maeda

@zundan Ruby 3.1以前だと"吉村家".encode("UTF-16").sizeも4になるので𠮷を2と数えているのではなくてBOMも数えているのかもしれません。コードユニット数を数えるのは.encode("UTF-16LE").bytesize / 2でよさそうな気がします

@shugo おわー。僕はずーっと勘違いしてましたね。ありがとうございます!