無窮 i ラボ Blog

知的ネット社会、知そのもの、機械との共生、プログラミングに関して。

 
 

UTF-8 で書かれたファイル hogehoge_UTF8.txt から、バッチファイル(.bat)に書かれた以下のコマンドで、内容を euc-jp にエンコードしファイル hogehoge_EucJp.txt を作成できる。

perl encode_utf8_to_euc-jp.pl < hogehoge_UTF8.txt > hogehoge_EucJP.txt

encode_utf8_to_euc-jp.pl

use Encode qw/ encode /;
use Encode qw/ decode_utf8 /;

@data = <STDIN>;

# http://blog.livedoor.jp/sasata299/archives/51186273.html
# http://d.hatena.ne.jp/kopug/20060903
foreach $ele (@data) {
$ele = decode_utf8($ele);
$ele =~ tr/[\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]/[\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}]/;
$ele = encode('euc-jp', $ele);
}

print @data;

なお、私は encode_utf8_to_euc-jp.pl をeuc-jpで保存している。
スポンサーサイト
 このエントリーをはてなブックマークする このエントリーを含むはてなブックマーク

UTF-8 で書かれたファイル hogehoge.txt から、バッチファイル(.bat)に書かれた以下のコマンドで jcode.pl を使い、内容を Shift JIS にエンコードしファイル hogehoge_sjis.txt を作成する処理を実施していたところ、変換できない文字が ¥x{...} に変換された。

perl -Mencoding=utf-8,STDOUT,shiftjis -pe1 < hogehoge.txt > hogehoge_sjis.txt

そして、他のプログラムによる処理を経て、Javascriptのファイルに ¥x{...} が書き込まれてしまい、¥マークによるエスケープが原因なのか、Javascriptが走らないという事象が発生した。

後で分かったことだが、

perl -Mencoding=utf-8,STDOUT,cp932 -pe1 < hogehoge.txt > hogehoge_sjis.txt

とするだけで、¥x{...} への変換はされなくなった。なお、cp932 は、Shift JIS と(ほぼ)同じである。

しかし、今回はレガシーな jcode.pl ではなく、現在のスタンダードらしい Encode.pm を使った処理に変更した。

バッチファイル

perl encode_utf8_to_cp932.pl < hogehoge.txt >hogehoge_sjis.txt

encode_utf8_to_cp932.pl

use Encode qw/ from_to /;

@data = <STDIN>;

foreach $ele (@data) {
from_to( $ele, 'utf8','cp932');
}

print @data;

(前述の処理と同じようにcp932への変換をしているので、) ¥x{...} への変換はされなくなった。
 このエントリーをはてなブックマークする このエントリーを含むはてなブックマーク
正規表現に変数を含める場合には、そのまま書く。

文字連結などはしない。

例:

foreach $ele (@url) {
foreach $ele_inner (@inner) {
if ($ele =~ /^$ele_inner/) {
# ↑バカみたいにそのまま書く
push (@out, $ele );
last;
}
}
}
 このエントリーをはてなブックマークする このエントリーを含むはてなブックマーク
jcodeでは、'euc-jp' でなくて 'euc' と記述する

Googleアドセンスがページ内に貼ってある簡単なPERLのプログラム.. - 人力検索はてな

ローカルサーバでテストしてみたところ、英語は通りましたが、日本語だと、Undefined subroutine &jcode::f called at jcode.pl line 400
のようになりました。
調べてみると、
&jcode’convert(*value, ’EUC-JP’); #’;
の部分が正しくないように思います。

メタタグなどではEUC-JPでしょうし、PHPのmb_convert_encodingなどでもEUC-JPを引数に使えるでしょうが、これはjcode.plですので、jcode.plにあった引数の形でないと動きませんよね。単なるコピー&ペーストミスの可能性も高いとも思いますが・・・。

&jcode’convert(*value, ’euc’); #’;
にして、再度テストしました。エラーログは出なくなりました。

 このエントリーをはてなブックマークする このエントリーを含むはてなブックマーク
sub Hogehoge {

my $sTextReg = '([^a-zA-Z0-9_])'.$sText.'([^a-zA-Z0-9_]|$)';

if ( $dummy2 =~ /$sTextReg/ ) {
$index_point = index($dummy2, $1.$sText.$2, 0) + 1;
# 文字列連結の . が必要
}

$dummy3 =~ s/$sTextReg/$1$rText$2/;
# 文字列連結の . は不要

return (0);

}
 このエントリーをはてなブックマークする このエントリーを含むはてなブックマーク