Ruby,Perl,Pythonのメモ〜文字コードと文字列長〜
メモ:
・日本語の取り扱いのめも その2(文字列長、バイト長について)
・バージョンはruby 1.9.1p129,perl v5.10.0,Python 3.0.1
・バージョンが古いと動かない
・ついでに 404 Blog Not Found:perl, python & ruby - chr() vs. Unicode と 404 Blog Not Found:perl, python & ruby - ord() vs. Unicode の情報は古いので、今の書き方を書いとく
ruby | perl | python | |
---|---|---|---|
文字列長 | 文字コード指定が正しいなら文字数 | utfフラグ付きなら文字数 | code unit数(文字数でない)*1 configureで--with-wide-unicodeすれば文字数 |
※1ただし、コンパイル時のオプションで変えられるらしい 参照:DSAS開発者の部屋:Python2.x/3.0のunicode内部表現について
→というわけで、ためしたらホントに文字数になった。
#!/usr/bin/ruby1.9 # coding: utf-8 str = "\u{20B9F 308B}" puts str puts str.length puts str.bytesize puts "\u{20B9F}".ord puts "\u{308B}".ord puts 0x20B9F.chr("utf-8") puts 0x308B.chr("utf-8") puts 134047.chr("utf-8") puts 12427.chr("utf-8")
#!/usr/bin/perl use strict; use warnings; use utf8; use feature ":5.10"; use bytes (); binmode(STDOUT, "utf8"); my $str = "\x{20B9F}\x{308B}"; say $str; say length $str; say bytes::length($str); say ord "\x{20B9F}"; say ord "\x{308B}"; say chr 0x20B9F; say chr 0x308B; say chr 134047; say chr 12427;
#!/usr/bin/python3.0 # coding: utf-8 str = "\U00020B9F\U0000308B" print(str) print(len(str)) print(len(bytes(str,"utf-8"))) print(ord("\U00020B9F")) print(ord("\U0000308B")) print(chr(0x20B9F)) print(chr(0x308B)) print(chr(134047)) print(chr(12427))
Perl Ruby Python --with-wide-unicode付き の結果
𠮟る 2 7 134047 12427 𠮟 る 𠮟 る
Python デフォルト(--with-wide-unicodeなし)の結果
𠮟る 3 7 134047 12427 𠮟 る 𠮟 る