• ベストアンサー

文字コード変換

送信元のページがShift_JISの場合は正常に動作するのですが、 UTF-8等の場合は文字化けしてしまいます。 &jcode'convert(*val, 'sjis'); ↑のものを use Encode; Encode::from_to( $val, "UTF8", "Shift_JIS", Encode::XMLCREF ); このように書いたところ、UTF-8も文字化けしないのですが、 コードを自動的に認識して自動で振り分けさせる方法がわかりません。 サーバーのPerlのバージョンは5.8.6です。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

> &jcode'convert(*val, 'sjis'); こういう呼び出しをしているということは jocde.pl をお使いですか? であれば、UTF-8には対応していないので望む結果が得られないのは当然でしょう。 Jocde.pm をインストールしてそれを使うか、Encode にも guess という文字エンコーディングを推測してくれるメソッドがあるにはあります。

MASTER-PPC
質問者

お礼

有難うございます。 > jocde.pl をお使いですか? はい。 検索で調べて以下の内容にしてみたところ、多少うまくいったのですが、「な」等の一部の文字のみを投稿した場合にうまく識別してくれないようでした。何か解決策はございますでしょうか?以前からこの問題を調べているのですが、本当に簡単な改造程度の知識しかないため、なかなか解決できそうにありません。申し訳ありませんが、よろしくお願いいたします。 use Encode; use Encode::Guess qw/ascii utf8 euc-jp shiftjis 7bit-jis/; my $dec = Encode::Guess->guess($val); if (ref $dec) { my $utf8str = $dec->decode($val); my $utf8str = Encode::decode($dec->name, $val); my $sjis_str = Encode::encode('shiftjis', Encode::decode($dec->name, $val)); Encode::from_to($val, $dec->name, 'Shift_JIS'); }

その他の回答 (2)

回答No.3

文字コードの自動判別をする場合、 Encode::Guess より、Jcode(.pm) モジュールを用いた方が良さそうです。 「な」一文字だと失敗すると言われているように、 Encode::Guessは短い文字列では判定できないことが多いです。 1つの文字コードに絞り込めない時は本当にただの「推測」です。 Jcode は Encode のラッパとして動作しますし、 最もマッチした文字コードで変換してくれるので、その様な失敗はかなり減ると思います。

MASTER-PPC
質問者

お礼

有難うございます。Jcodeについても勉強して試させてもらいます。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

文字化け防止って難しいですよね。 入力フォームに hidden で、定型文字を埋め込み、入力データを UTF-8, Shift_JIS などと想定してデコードし、元の定型文字に 戻せたものを入力データの文字コードとする手法を見たことが あります。 ただ、定型文字に何を選ぶかが難しいようです。

MASTER-PPC
質問者

お礼

有難うございます。なるほど、工夫次第ということですね。大変参考になりました。

関連するQ&A