« 軽いデスクトップ環境は...というわけでLXDE | トップページ | いいんじゃないかな、SeaMonkey »

2012年2月 5日 (日)

UNICODEだからってutf-8とはかぎらない...ってこと?

Vine linuxも標準のLANGがUTF-8になってしばらく経ちました。もう、JISやら
Shift-JISやらEUCやらで苦労したことなんて忘れかけておりますが、プログラ
ミングの世界ではまだ色々あるようで...
Perlは、たしかバージョン5.8からUNICODE対応になった(内部で扱う文字列が
UNICODEになったということ?)だったかと思います。でも、何も指定しないと、
文字列はbyteで扱われますから、例えば、以下のコードでは、

----------------------------------------------------------
#!/usr/bin/perl

$string = "日本語ABC";
print "「日本語ABC」の文字数:",length($string),"\n";

-----------------------------------------------------------

単に「日本語ABC」の文字数を表示するだけのプログラムですが、実行結果は

----------------------------------------------------------
「日本語ABC」の文字数:12
----------------------------------------------------------

と、多分バイト数が勘定されて、正しい結果になりませんね。
そこで、"use utf8;"を指定すると、

----------------------------------------------------------
#!/usr/bin/perl

use utf8;

$文字列 = "日本語ABC";
print "「日本語ABC」の文字数:",length($文字列),"\n";

-----------------------------------------------------------

こんなふうに、日本語の変数が使えたりしますし、実行結果も

-----------------------------------------------------------
Wide character in print at ./perl_test.perl line 6.
「日本語ABC」の文字数:6

-----------------------------------------------------------

文字数に関しては、6と正しくなっていますね。これは、単純に"use utf8;"の
御利益というわけですな。ところが、
   "Wide character in print at ..."
ってえのは一体何なのでしょう?そこで、
  http://www.rwds.net/kuroita/program/Perl_unicode.html
などを拝見しますと、これは、perlの内部的にUTF8フラグがついた文字列を
printしようとした時に出る警告とのこと。
どうしてそういう発想になっちゃうの??...と思うのですが、きっと何か
Perlの事情があるんでしょう。
これの一番簡単そうな対処法は、"binmode"というのを使って、

----------------------------------------------------------
#!/usr/bin/perl

use utf8;
binmode STDOUT,":utf8";

$文字列 = "日本語ABC";
print "「日本語ABC」の文字数:",length($文字列),"\n";

-----------------------------------------------------------

これで標準出力に関しては警告は出なくなります。
要するに、「"use utf8;"をするときはbinmodeも入れる」と...
よーく覚えておこうっと。

さて、この問題は、内部的に文字列がUNICODEとして扱われていても、どういうふう
にencodeして入出力するかは知らんということなのかと思います。
過去、SWI-Prologでも似たような経験があります。
ある日、SWI-Prologを使っている上司から、
「日本語を含むルールファイルを、コマンドラインで読み込ませるとちゃんと処理する
のに、CGIで起動すると結果が文字化けする」
という相談を受けました。
色々調べてみたところ、結論はこうでした。
    (→ http://www.swi-prolog.org/man/widechars.html)
  ○SWI-Prologも内部的には文字列をUNICODEで扱っている。
  ○でも、ファイルのencodingに関しては、LANG環境変数で判断している。
  ○CGIではLANG環境変数が定義されていなかったので、byteで処理してしまった。

私、UNICODEやutf-8で大喜びしていましたが、実はそんな単純な問題じゃないんですね。

にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

にほんブログ村
IT技術ブログへ
にほんブログ村

|

« 軽いデスクトップ環境は...というわけでLXDE | トップページ | いいんじゃないかな、SeaMonkey »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/152716/53904646

この記事へのトラックバック一覧です: UNICODEだからってutf-8とはかぎらない...ってこと?:

« 軽いデスクトップ環境は...というわけでLXDE | トップページ | いいんじゃないかな、SeaMonkey »