人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlの文字コード変換について質問です。

変数に入れた文字列を全てShift-jisに変換して、sendmailしたいのですが、
全く変換されていないようです。

jcode::convert(\$test,'sjis');

こんなことをやってみたのですがダメでした。
EUCがきてもUnicodeが来てもShift-jisに変換するにはどのようにしたらよいでしょうか?

●質問者: petshop
●カテゴリ:インターネット ウェブ制作
✍キーワード:EUC JIS Perl sendmail SJIS
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●27ポイント

おそらく jcode.pl を使用されているようですが、

Jcode.pm の方が便利ですよ。

http://search.cpan.org/dist/Jcode/Jcode/Nihongo.pod

use Jcode;
$test = Jcode->new($test)->sjis;

また、変換方法としては該当の方法であっていると思います。

文字コードの自動判別はなかなか難しく、100%の方法はありません。

HTML の FORM 等から受け取ったデータであれば、あらかじめ固定のデータ(例:あいうえお)とかを同時に POST させてそちらで文字コードを判別するのも手だと思います。

http://www.tohoho-web.com/wwwxx005.htm


2 ● shotaro_tsuji
●27ポイント

Perl 5.8以降ならばEncode.pmを使うべきでしょう。

又、Encode.pmならば文字コードがわからなくても来る可能性のある複数の文字コードを指定しての変換も可能なようです。

詳しくは下のサイトを。

http://www.hikoboshi.org/perl/doc/encode.html


3 ● まきのっぴ
●26ポイント

手順はそれで合っています。


ただし、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 をつけてやらないとメールソフトで読もうとしたときに文字化けする可能性がありますが、その点は大丈夫でしょうか?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ