作者: 藤岡和夫
日時: 2008/6/28(18:48)
On Sat, 28 Jun 2008 11:11:02 +0900
"Bruce." <kbk@...> さんwrote:

> あまり複雑なことをしないのなら
> 
> ・入力は必ず decode する
> ・文字列操作は必ずフラグ付きの文字に対して行う
> ・出力は必ず encode する
> 
> などいくつかの縛りをつけてやればそれほど難しい話でもないと思いますが
> どんなもんでしょうか。

 なるほど、そうですね。実は、それはスクリプティング言語側の仕事であるべ
きというのが私の意見ですけどね。入出力の作業が増えたのが気に入らない。も
ちろん、バイト列として取り扱いたい場合がありうるのかもしれませんが、むし
ろそちらを例外的な操作としたほうがわかりやすい。

1. 文字列はUTF-8を使うことが前提。
2. 入力時にUTF-8フラグを必ず立てる。
3. UTF-8フラグを立てた状態で文字列処理を行う。
4. 出力時はUTF-8フラグを降ろす。

このフラグを立てたり、降ろしたりというのが、どうもスマートには思えないん
ですね。しかし、ないものねだりをしても仕方がないので、フラグを立てたり、
降ろしたりに何を使うかを考えました。

A. 日本語文字列しか使えませんが、Unicode::Japaneseモジュールを使う方法。

-----^
use Unicode::Japanese;
$chars = "い,ろ,は,に,ほ,へ,と,ち,り,ぬ,る,を,わ,か,よ,た,れ,そ,つ,ね,な,ら,む,う,ゐ,の,お,く,や,ま,け,ふ,こ,え,て,あ,さ,き,ゆ,め,み,し,ゑ,ひ,も,せ,す,ん";
@tbl = split(",", Unicode::Japanese->new($chars)->getu);
foreach (@tbl){
	$char{$_} = $i++;
}
while(<DATA>){
	chomp;
	@chars = split(//, Unicode::Japanese->new($_)->getu);
	print scalar(@chars),"\n";
	for($j=0;$j<=$#chars;$j++){
		$numstr .= sprintf("%02d", $char{$chars[$j]});
	}
	$words{$numstr} = $_;$numstr = "";
}
foreach $numstr (sort keys %words){
	print "$numstr ", Unicode::Japanese->new($words{$numstr})->get,"\n";
}
__END__
いぬ
とちのき
にんじん
はむたろう
ろば
へらぶな
とり
ほらがい
-----$

B. utf8プラグマを使う方法

----^
use utf8;
@tbl = split(",","い,ろ,は,に,ほ,へ,と,ち,り,ぬ,る,を,わ,か,よ,た,れ,そ,つ,ね,な,ら,む,う,ゐ,の,お,く,や,ま,け,ふ,こ,え,て,あ,さ,き,ゆ,め,み,し,ゑ,ひ,も,せ,す,ん");
foreach (@tbl){
	$char{$_} = $i++;
}
while(<DATA>){
	chomp;
	@chars = split(//, $_);
	print scalar(@chars),"\n";
	for($j=0;$j<=$#chars;$j++){
		$numstr .= sprintf("%02d", $char{$chars[$j]});
	}
	$words{$numstr} = $_;$numstr = "";
}
foreach $numstr (sort keys %words){
	utf8::encode($words{$numstr});
	print  "$numstr ",$words{$numstr},"\n";
}
__END__
いぬ
とちのき
にんじん
はむたろう
ろば
へらぶな
とり
ほらがい
-----$

いずれも、UTF-8で保存して試すこと。

藤岡 和夫
kazuf@...
日曜プログラマのひとりごと http://homepage1.nifty.com/kazuf/renewal.html