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. Unicode404 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内部表現について
 →というわけで、ためしたらホントに文字数になった。

ファイル:utf-8、コンソール:utf-8

Ruby

#!/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")


Perl

#!/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;


Python

#!/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
𠮟
る
𠮟
る