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


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

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

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2006/12/12 15:55:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント27pt

おそらく 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

id:shotaro_tsuji No.2

回答回数32ベストアンサー獲得回数0

ポイント27pt

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

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

詳しくは下のサイトを。

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

id:pmakino No.3

回答回数358ベストアンサー獲得回数30

ポイント26pt

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


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

  • id:b-wind
    Jcode.p 2.0 以降のバージョンでは利用できる場合は Encode.pm のラッパーとして動作するのでとりあえずどちらにするか悩んだ時は Jcode.pm を選択する事をオススメします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません