• ベストアンサー

文字コード変換

送信元のページが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です。よろしくお願いいたします。

  • Perl
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • 文字コードsjisをUTF8に書き換えたい

    CGIの勉強中の者です。 文字コードはSJISで保存しているCGIをUTF8コードに換えるには何が必要でしょうか? HTMLならmeta内をSJISからUTF8に変更し、TeraPadなどのテキストエディタでUTF8に保存すればオッケーなんですが。 CGIの場合はHTMLと違って、換えるには複雑なのでしょうか? CGIプログラムの中では以下の「sjis」を「UTF8」に書き換えし、UTF8で保存しましたけど、文字化けが出てます。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; 宜しくお願いします。

    • 締切済み
    • CGI
  • メールフォームで文字化けが出る

    http://okwave.jp/qa5038084.htmlの引き続きです。(メールフォーム) <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; ↓ sjis関連をutf8に書き換え、jcodeの頭文字をJに書き換え <meta http-equiv="Content-Type" content="text/html;charset=utf8"> &Jcode'h2z_utf8(*contenido) &Jcode'convert(*subject,'utf8'); &Jcode'convert(*infor,'utf8'); &Jcode'convert(*contenido,'utf8'); &Jcode'convert(*res_msg,'utf8'); print "Content-type: text/html;charset=shift_utf8\n\n"; require 'jcode.pl'をuse Jcode;に書き換え ※jcode::" となっている箇所はありません 結果 メールフォームはエラーや文字化けは出なくて成功しましたが、メール受信の際、ThunderbirdPortableメーラーでは全て文字化け(文字エンコーディングは「日本語ISO-2022jp」となっています)、ウェブメールのgmailでは内容は文字化けになっていませんが、タイトルが文字化けになっています。 どこが悪かったのでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • shift-jisからutf8に変換

    解決に至らなかったので再度お尋ねします。 CGIのコードを見てくださいますか。 http://hotpegasus.bov.jp/mail.txt (必要な部分だけ表示しておりますので、そのままアップしても機能はしません) 改修した箇所は以下のです。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; ↓ sjis関連をutf8に書き換え、jcodeの頭文字をJに書き換え <meta http-equiv="Content-Type" content="text/html;charset=utf8"> &Jcode'h2z_utf8(*contenido) &Jcode'convert(*subject,'utf8'); &Jcode'convert(*infor,'utf8'); &Jcode'convert(*contenido,'utf8'); &Jcode'convert(*res_msg,'utf8'); print "Content-type: text/html;charset=shift_utf8\n\n"; require 'jcode.pl'をuse Jcode;に書き換え ※jcode::" となっている箇所はありません 結果 メールフォームはエラーや文字化けは出なくて成功しましたが、メール受信の際、ThunderbirdPortableメーラーでは全て文字化け(文字エンコーディングは「日本語ISO-2022jp」となっています)、ウェブメールのgmailでは内容は文字化けになっていませんが、タイトルが文字化けになっています。 どこが悪かったのでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • Perlの文字コード変換について

    ActivePerl-5.14を使っているのですが、文字コードの変換はどのようにすればいいのでしょうか。 ローカル環境で動かしているのですが、Shift-JISのテキストを読み込んで、EUC-JPに変換したいと思っているのですが、 今まで5.8を使っていたので、Jcodeを使って、&Jcode::convert(\$txt,'euc'); としていたのですが、5.14ですと use Jcode;  の時点でエラーになってしまいます。 use Encode; を使って、 from_to($txt, 'shiftjis', 'euc'); としてみましたが、 from_to($txt, 'shiftjis', 'euc'); のところでエラーになってしまいます。 ActivePerl-5.14ですと、どのように文字コードの変換をすればいいのでしょうか。 どなたか教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Jcodeで変換できません。。。

    下記のCGI(文字コードはutf-8)を作成したのですが、正常に表示されません。 ~を上手に判定できていないということでしょうか??? また、もし、正しく変換できないのであれば、Jcodeで変換できない文字の一覧などあれば助かります。 分かる方、何卒、宜しくお願い致します。 #!/usr/bin/perl print "Content-type: text/html;charset=Shift_JIS\n\n"; $str = "1~10"; use Jcode; Jcode::convert( \$str,"sjis","utf8"); print $str; 表示された結果 1?10 となりました。

    • ベストアンサー
    • Perl
  • 文字コードの違うデータを判別したい

    データの文字コードが異なるファイルを確認します。 以下のスクリプトで$get_csvのデータの文字コードを判別にShift-JISで別のファイルに格納したいのです。 (スクリプト) $get_csv = get("$_[0]"); if ($get_csv =~ /utf-8/i) { &jcode'convert($get_csv,'sjis','utf-8'); } if ($get_csv =~ /EUC-JP/i) { &jcode'convert($get_csv,'sjis','euc'); } (ここまで) &jcode'convertの使い方が悪いのか?データをうまく変えられていない感じがします。 上記の内容で説明が足りてますでしょうか? よろしくお願いいたします。

  • 文字変換について

    Perlの文字変換について質問があります。 文字コードをJISからShift_JISに変換するには、下記のどれが正しい記述なのでしょうか? ・Encode::from_to($_, "jis", "shiftjis" ) ・encode("shiftjis", $_) ・encode("shiftjis", decode("utf8", $_)) 以上、よろしくお願い致します

    • ベストアンサー
    • Perl
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • JcodeモジュールとEncodeモジュール

    以下、Perl5.8でJcodeモジュールを使った場合とEncodeモジュールを使った場合の違いについて、知りたいです。 ※そもそもこのモジュールは同時に使ったらだめなのでしょうか? use strict; use utf8; use Jcode; use Encode; my $dat1 = "あイ卯(1)Iⅰ"; Jcode::convert(\$dat1, "utf8"); my $dat2 = "あイ卯(1)Iⅰ"; $dat2 = Encode::encode("utf8", $dat2); 文字コード変換の正しい使い方が知りたいです。

    • ベストアンサー
    • Perl
  • ver.5.8.8の文字化け

    サーバの移転でアクセスログを変更しているのですが、CGIで苦戦しています。 テキストデータが全て文字化けをしてしまいます・・・。 エキストデータ、ソースは全てSJISです。 perlのバージョンが5.8.8になりましたので、それまで使用していたjcode.plが使えないようです。 require './jcode.pl'; jcode::convert($refer, 'sjis') if ($charset); でエラーになります。 jcode.pm用に use Jcode; Jcode::convert($refer, 'sjis') if ($charset); としてもエラーになります。 これはjcode.pmが入ってないからだと思うのですが、 何か方法はないでしょうか? PHPはわかるのですが、Perlは全然わかりません。 どうか、ご教授をお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう