Perl 5.8.x における日本語コード変換のメモ。 Perl 5.8.x Unicode関連。 perl5.8のUnicodeサポート。 もーこれで理解できます?
元々 ARIB8単位符号体系 の追加記号集合(ARIB STD-B24 p1v2 Table7-20とか)を、 Webアプリ上で正しく扱うためにUnicodeサポートが必要だっただけなのに。
既存のPerlモジュールもCGI.pm内部コード問題 みたいなのが普通に放置されている現状。
とりあえずuse Encode;しただけで各モジュールの動作が変わってしまうとかマジでやめてくれないだろうか。 Perl 5.8以前でJcode.pmを使っていたように、明示的に呼び出した部分だけ適切な文字コード変換を行ってくれる だけでいいんだが、こんな簡単なことさえ実現することができない俺。PerlIOムッ殺す。
use open IO => ":utf8"; use open ":std";
しててもCGI上でprintすると Wide character in printって怒られる 。
頼みの綱のEncode::Guessは、検索用のform文に入力されるような短い単語だと頻繁に例外吐いて 落ちる... 。 Encode::Guess::guess_encodingで候補リストチェックしてると結構長い単語でも2つ以上候補があるし。
shiftjis or utf8 at /usr/lib/perl/5.8/Encode.pm line 186
これはほっとけば時間が解決するのか?もういっそ別のプラットホームに移行した方が早い気がしてきた。
use Encode;しただけでモジュールの動作変わります?(use encoding;はまた別ですが…)<br>use openのところは、順番逆にしたら動くような気もします。
ごめんなさいuse Encodeの件は勘違いでした(use utf8とごっちゃ?)。<br><br>ちなみに<br>------------unk2uni.pl--------------<br>use strict;<br>use Encode;<br>use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;<br><br>sub uni2uni::utf8 {<br> my ($str) = @_;<br> my $decoder = Encode::Guess::guess_encoding($str);<br> if (ref $decoder && $decoder->name !~ m!or!) {<br> return Encode::encode('utf8', $decoder->decode($str));<br> } else {<br> return $str;<br> }<br>}<br><br>1;<br><br>------------a.pl---------------------<br>require 'unk2uni.pl';<br><br>my $a = 'やじうまプラス'; # euc-jp<br><br>print &unk2uni::utf8($a);<br><br>-------------------------------------<br><br>けっこう長いと思うんだけど、EUC-JP×, 7bitJIS○, シフトJIS○でした。<br><br>なんで、現状Encodeを使う気力はなく、use utf8せずIO回りはバイトストリームのままで、<br>メンテされてなさげなJcode.pmを細々使う...という戦術で逃れることにしますた。<br>ダメですかね。
とりあえずPerlにしろEncodeにしろCGIにしろ問題が再現するバージョンを示さないといろいろな意味でしょうのない記事だとおもいますたがどうか。
とりあえず、<br><br>sub unk2uni::utf8 {<br> my ($str) = @_;<br> my $decoder = Encode::Guess::guess_encoding($str);<br> if ( ref $decoder && $decoder->name !~ m!or! ) {<br> return Encode::encode( 'utf8', $decoder->decode($str) );<br> }<br> else {<br> Encode::from_to( $str, "euc-jp", "utf8" );<br> return $str;<br> }<br>}<br><br>たとえば、こうすればいいんじゃないかと……
ちょろっと実験してみたけど、guess_encodingを2パラメータ形式で使って、一段目はshiftjis抜き、それで失敗した時だけ二段目としてeuc-jp抜き、の二段階でguessするようにしてみたら、euc-jpでもsjisでもやじうまプラス攻略できたお。あんまりキレイじゃない気もせんでもないけど。(Perl 5.8.8 / Encode 2.15)<br><br>っつーワケで、わしはこれでもういいw。<br>まぁ「やじうまプラス」がテストケースとして有用なことがわかった点ではいい記事ですた。
大雑把には<br><br>my $decoder = guess_encoding($str, qw/utf8 euc-jp/);<br>$decoder = guess_encoding($str, qw/shift-jis 7bit-jis) if (! ref($decoder));<br>if (ref($decoder)) {<br> $ret = $decorder->decode($str);<br>}<br>else {<br> ; Error<br>}<br><br>とか、そんな感じ。