●PerlでONS 半角2全角
Encode.pm(標準モジュール)でNスクにおけるメッセージ中の半角英字、カナを全角に変換してみる。
あまり意味もなくモジュール仕立て。瀬里奈の時、ここでだけ "use utf8" したかったんだっけ?
※hontai.pl コンバータ本体です。
use nsc_h2z;
~
略
~
nsc_h2z::nh2z("1.txt");
exit;
※nsc_h2z.pm 同梱するとかで package nsc_h2z;
use utf8; use Encode; use Encode::JP::H2Z;
use open IO => ":encoding(cp932)";
sub nh2z{ my $file = $_[0]; open (local *IN,"$file"); open (local *OUT,">temp.txt"); while ( my $line = <IN> ){
if ( $line !~ /^[0-9a-zA-Z;\*\t]/ ){ # 命令文チェック chomp $line; my $text = $line; my $tag; if ( $line =~ /^(\[.*?\])(.*)/ ){ # タグ $tag = $1; $text = $2; } $text = Encode::encode("euc-jp",$text); Encode::JP::H2Z::h2z(\$text); $text = Encode::decode("euc-jp",$text); $text =~ tr/?!a-zA-Z0-9/?!a-zA-Z0-9/; $line = "$tag$text\n"; } print OUT $line;
} close IN; close OUT; rename "temp.txt","$file" if unlink "$file"; } 1;
use utf8 下で、なおかつ一度 euc-jp にエンコードした文字列を渡してやらないと上手くいかないようです。
shift-jis(原文) → utf8 (Perl内部) → euc (半角全角処理)→ utf8 (に戻して)→ shift-jis (出力)
記号は $text =~ tr/?!a-zA-Z0-9/?!a-zA-Z0-9/; に追記で適当に対応しましょうか。
…なんだかよくわからない文字はなんだかよくわからないままで。沙耶の唄は微妙かも
コメント
use nsc_h2z;
open IN,"./script/saya.txt";
nsc_h2z::nh2z("./script/saya.txt");
で試してみた所
Malformed UTF-8 character (unexpected continuation byte 0xa1, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xa9, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xa1, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xaa, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xa3, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected non-continuation byte 0x2d, immediately af
ter start byte 0xe1) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xa3, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected non-continuation byte 0xc1, 1 byte after s
tart byte 0xfa, expected 5 bytes) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xb0, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xa3, with no preceding
start byte) in require at nsc_h2z.pm line 26.
Malformed UTF-8 character (unexpected continuation byte 0xb9, with no preceding
start byte) in require at nsc_h2z.pm line 26.
の後、
"\x{06a3}" does not map to cp932 at nsc_h2z.pm line 29, line 1.が多数
で、
panic: sv_setpvn called with negative strlen at nsc_h2z.pm line 29, line 1.
"\x{06a3}" does not map to cp932, line 1.
"\x{06a3}" does not map to cp932, line 1.
"\x{06a3}" does not map to cp932, line 1.
"\x{06a3}" does not map to cp932, line 1.
"\x{0680}" does not map to cp932, line 1.
panic: sv_setpvn called with negative strlen, line 1.
となって落ちてしまいました
こちらの扱いのミスの可能性も高いですがどうなんでしょうか
Posted by: ざれ | 2008年02月13日 09:53
出力は、1.txtは無しで、temp.txt内で
今度ノすタfセセf劔。→今度ノすタ\x{06a3}セセ\x{06a3}劔。
となっています
処理が途中で終わってしまっているのでtemp.txtの容量もかなり足りませんが・・・むぅ
Posted by: Anonymous | 2008年02月13日 09:56
あ、nsc_h2z.pmは文字コードをUTF-8で保存してください。
他にもエラーの要因があるかもしれませんが、とりあえず「今度ノすタfセセf劔。」単行のファイルでは
→「今度ノすタfセセf劔。」となりました。って何語だこれ
それはそれとして、見直すとモジュールとするには行儀が悪いので、単体で実行するとかサブルーチンで入れた方がいいのかも
微妙に修正しましたけれど 1.txt(saya.txt) は一応closeしといてくださいな
Posted by: ひとつもり | 2008年02月13日 21:53
動作しました
サンクスです
Posted by: ざれ | 2008年02月13日 22:40
いえ、なんだか差し出がましくてすみませぬ
Posted by: ひとつもり | 2008年02月14日 00:06
いえ、助かりました
エラーにガクブルしながらワケの分からない置換処理を延々と書くのが嫌になってきてた所でした
処理として組み込むかファイルとして同梱するかになると思いますが使わせていただきますです
感謝~
Posted by: ざれ | 2008年02月14日 00:42