«前の日記(2009-04-27) 最新 次の日記(2009-04-30)» 編集

ぱぱネット(仮)


2009-04-28 もう全部バイトストリームでいいじゃないか [長年日記]

_ 俺が馬鹿なだけなの

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

これはほっとけば時間が解決するのか?もういっそ別のプラットホームに移行した方が早い気がしてきた。

本日のツッコミ(全6件) [ツッコミを入れる]
_ FIRST (2009-04-28 12:48)

use Encode;しただけでモジュールの動作変わります?(use encoding;はまた別ですが…)<br>use openのところは、順番逆にしたら動くような気もします。

_ (2009-04-28 14:01)

ごめんなさい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>ダメですかね。

_ もぽ (2009-04-29 13:29)

とりあえずPerlにしろEncodeにしろCGIにしろ問題が再現するバージョンを示さないといろいろな意味でしょうのない記事だとおもいますたがどうか。

_ こにしか (2009-04-29 14:04)

とりあえず、<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>たとえば、こうすればいいんじゃないかと……

_ もぽ (2009-04-29 14:26)

ちょろっと実験してみたけど、guess_encodingを2パラメータ形式で使って、一段目はshiftjis抜き、それで失敗した時だけ二段目としてeuc-jp抜き、の二段階でguessするようにしてみたら、euc-jpでもsjisでもやじうまプラス攻略できたお。あんまりキレイじゃない気もせんでもないけど。(Perl 5.8.8 / Encode 2.15)<br><br>っつーワケで、わしはこれでもういいw。<br>まぁ「やじうまプラス」がテストケースとして有用なことがわかった点ではいい記事ですた。

_ もぽ (2009-04-29 14:31)

大雑把には<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>とか、そんな感じ。


2001|04|
2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|05|10|

[BANNER]
このサーバーをもう12年も維持しているかと思うとめまいがしますよ。
ツッコミ機能は、ハンドル名が完全日本語じゃないと登録できません。
また、本文にURLが含まれていても登録できません。
いずれもSPAM対策です。
[Panda Papanda]
2009年
4月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

[Papanda]  [Kuma]  [Tomorin]  [Iron]  [Eiza]  [Dokkin]  [Honya]  [Zyou]  [Tsuyo]  [Bike]  [KoeBBS]  [Chukei]  [portal]  [tvmatome]  [KaoPaku] 

訪問者数:(+2560143)