お報せ

童帝雑談所自動抽出でAAではないレスを拾う場合がある件に関する説明

Google chrome使用時に順番がズレるケースがある問題について












スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

文字化け対策

EUCの機種依存文字をUTF8に変換するさいにロボットが自前でやると、どの方法をとっても何らかの文字が化けてしまうので、非効率的な処理に逃げました。
これで今後取得するDATは化けてない…はず……。

※つまり既に取得orまとめ済みのは別途個別に処理しないといけない
やったこと。


フィルター箇所

} elsif ( $self->{"encoding"} eq "utf8") {
my $tmp = "/tmp/tmp_".$$."_".time();
if ( ! open FH , "| /home/www/bin/EUCtoUTF8.php > $tmp" ) {
return Jcode->new($str,$icode)->utf8;#念のため
}
print FH $str;
close(FH);
my $u = `cat $tmp`;
unlink($tmp);
return $u;
}


フィルタコマンドをcatしたもの

user@nono:/home/www/af/robot$ cat /home/www/bin/EUCtoUTF8.php
#!/usr/bin/php
<?php
$fp = fopen("php://stdin" , "rb");
if ( !$fp ) exit;
$stdin = "";
while ( $line = fread($fp , 8192) ) {
$stdin .= $line;
}
fclose($fp);


print mb_convert_encoding(
mb_convert_encoding($stdin,"sjis-win","EUC-JP") ,
"UTF-8","sjis-win");

?>user@nono:/home/www/af/robot$


※参考にしたサイト様:http://www.asp-edita.jp/doda/one/doda5728_15.html


試作品ですので、かなりいい加減です。
ファイルハンドル開いて読めばいいところをcatしてたりとかはツッコまないでください。書いてるうちに面倒くさくなったんだよー。

本当は、


open FH , "| /home/www/bin/EUCtoUTF8.php |" ;
print FH $str;
my $encoded = <FH>;
close(FH);


こんなかんじに書きたかったんですが、

http://perldoc.jp/func/open
http://perldoc.jp/docs/perl/5.14.1/perlopentut.pod

できそうに無い。
「えー?」と思いつつ古いドキュメントもあたってみると。

http://flex.ee.uec.ac.jp/texi/perl/perl_86.html


`open FILEHANDLE'
ファイル名が EXPR で指定されるファイルを open し、 FILEHANDLE と結び付ける。 FILEHANDLE が expression の場合は、その値が実際のファイルハンドルの名前として用いられる。 EXPR を省略した場合、 FILEHANDLE と同名のスカラー変数がファイル名を持つ。

ファイル名が `<' で始まるか何も付いていない場合はファイルは入力用にopen される。
`>' で始まる場合は出力用に open される。
`>>' で始まる場合は 追加用に open される。
`>' や `<' の前に `+' を付けるとファイルに対し read および write 両方の許可を得ることができる。
ファイル名が `|' で始まる場合はコマンドであると解釈され、出力がそのコマンドにパイプされる。
ファイル名が `|' で終わる場合もコマンドであると解釈され、そのコマンドから入力がパイプされる。 (入力・出力両方をパイプするコマンドは必要ないであろう。)
`-' は STDIN を open し、 `>-' は STDOUT を open する。

成功すれば non-zero を返し、そうでない場合は undefined を返す。 open がパイプを含む場合、返り値はサブプロセスの pid になる。


はい、おわた。

という理由で、こんな毎回テンポラリファイル経由するダサい実装になりました。
(これでガックリきて気力-50くらって、テンポラリファイル読むコード真面目に書くの面倒になって cat 経由にしちゃったりした)



これ、将来的にはperlを捨てて、ロボットを全部PHPかJavaどっちかで書き直すべきなのかなぁ。

Shift_JISに機種依存文字混ざってて困る経験は結構したけど、EUC_jpに機種依存文字混ざってて困る経験ってのは初めてでした。
関連記事
[ 2012/09/06 22:58 ] 雑事 | TB(0) | CM(0)

コメントの投稿













管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://evevn.blog.fc2.com/tb.php/539-a70f1350


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。