- 2006-07-04 (火)
- Perl
yet another way to peek at scalar's utf8-flag...
DBIモジュールのperldocを読んでいて「む、これイイかも」と思えたユーティリティ関数。任意の文字列なりスカラ変数なりを渡すと、utf8-flag状態 / ascii or non-ascii 判定 / 文字数 / バイト数 ... 等の詳細情報をポロッと返してくれます。
use DBI;
print DBI::data_string_desc('hoge');
#実行結果
UTF8 off, ASCII, 4 characters 4 bytes
以下、いろんなパターンでの実行結果:
# 'abc'
UTF8 off, ASCII, 3 characters 3 bytes
# utf8 flagged 'abc'
UTF8 on, ASCII, 3 characters 3 bytes
# 'あいう'
UTF8 off, non-ASCII, 9 characters 9 bytes
# utf8 flagged 'あいう'...
UTF8 on, non-ASCII, 3 characters 9 bytes
# utf8 flagged, でも euc-jp な 'あいう'...
UTF8 on, non-ASCII, 6 characters 12 bytes
utf8-flag の状態を調べるだけなら utf8::is_utf8() やら Encode::is_utf8() 等(あるいは Devel::Peek)があるけれど、その他付加情報もこうやって手軽に入手できる辺りが「あら素敵」、と思えました。
2つの文字列の情報差分を判定する - data_string_diff
そんなユーティリティ関数もあるようです。utf8-flag がONの文字列とOFFの文字列の差分を調べると、こんな結果が返ってきます:
use DBI qw(data_string_diff);
use Encode qw(decode);
$x = 'あいう';
$y = decode('utf8','あいう');
print data_string_diff($x,$y);
# 実行結果
Strings differ at index 0: a[0]=・ b[0]=\x{3042}
data_string_desc も diff も、DBI系の処理だけに限らず、ちょっとした utf8-flag 周りでのトラブルの際に便利っすね。
利用可能なDBIのバージョン
The data_string_desc() function was added in DBI 1.46.
The data_string_diff() function was added in DBI 1.46.
共にバージョン 1.46 で追加された関数の模様。