変数に入れた文字列を全てShift-jisに変換して、sendmailしたいのですが、
全く変換されていないようです。
jcode::convert(\$test,'sjis');
こんなことをやってみたのですがダメでした。
EUCがきてもUnicodeが来てもShift-jisに変換するにはどのようにしたらよいでしょうか?
おそらく jcode.pl を使用されているようですが、
Jcode.pm の方が便利ですよ。
http://search.cpan.org/dist/Jcode/Jcode/Nihongo.pod
use Jcode; $test = Jcode->new($test)->sjis;
また、変換方法としては該当の方法であっていると思います。
文字コードの自動判別はなかなか難しく、100%の方法はありません。
HTML の FORM 等から受け取ったデータであれば、あらかじめ固定のデータ(例:あいうえお)とかを同時に POST させてそちらで文字コードを判別するのも手だと思います。
Perl 5.8以降ならばEncode.pmを使うべきでしょう。
又、Encode.pmならば文字コードがわからなくても来る可能性のある複数の文字コードを指定しての変換も可能なようです。
詳しくは下のサイトを。
手順はそれで合っています。
ただし、jcode.pl は Unicode に対応していません。
Jcode.pm なら Unicode (UTF-8/UCS2) 対応ですので、もし入力コードが Unicode であることが原因で変換されていないのであれば、Jcode.pm に置き換えることで解決するでしょう。
使い方は b-wing さん紹介の通りです。
また、入力文字列の内容によっては、自動判別では誤判定する可能性があります。
もし入力コードがあらかじめわかっているなら、入力コードも明示した方が確実です。
例えば入力コードが EUC-JP だとはっきり判っているなら、
$test = Jcode->new($test, 'euc')->sjis; や
Jcode::convert(\$test, 'sjis', 'euc'); といった具合です。
なお、入力コードがあらかじめ判っているなら Perl 5.8 付属の Encode.pm を使うのがより良いかと思います。(Perl 5.8.x Unicode関連 参照)
from_to($test, 'euc-jp', 'shiftjis'); や
$test = encode('shiftjis', decode('euc-jp', $test)); といった具合です。
(Encode.pm ファミリーにも自動判別機能 (Encode::Guess) がありますが、使いづらくおすすめできません)
また、気になる点として、Shift_JIS に変換した内容をメールで送信するなら Content-Type ヘッダに text/plain; charset=Shift_JIS をつけてやらないとメールソフトで読もうとしたときに文字化けする可能性がありますが、その点は大丈夫でしょうか?
コメント(1件)