• ベストアンサー

CGI(Perl)の文字化けについて

WEBフォームからの入力データをHTMLに加工して表示するというシンプルなCGIプログラムなのですが、 全角スペースの後に全角カタカナが入ると、全角スペースの部分から後が文字化けしてしまいます。 他はきちんと表示されているのですが、全角スペースとカタカナが続いているのが良くないみたいで、文字化けしてしまうようです。 全角スペースを取ってしまえばいいのかと思い、WEBで検索して色々と試してみましたが、変わりません。。 このような場合はどういう対処をするのが一番いいのでしょうか。 文字コードはEUCを使っています。(WEBフォーム、CGIとも) 教えてください。よろしくお願いいたします。

noname#223023
noname#223023
  • CGI
  • 回答数10
  • ありがとう数10

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

  • ベストアンサー
  • petita
  • ベストアンサー率53% (8/15)
回答No.9

失礼しました。 $val=~s/(?<!\xA1)\xA1\xA5/\x2E/g; でいいと思いますが、J(j)code::tr を使う方が良いかもしれませんね。

noname#223023
質問者

お礼

petitaさん ご回答ありがとうございました。 教えて頂いたやり方で変換されていました! ありがとうございました! でもJ(j)code::tr を使う方がいいのですね。。

その他の回答 (9)

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.10

現在は標準モジュールのEncodeを用いるのが一般的です。Encodeモジュールのdecode関数でテキスト文字列に変換してから文字列処理をします。 Encodeモジュールを使えば例えば以下のようにできます。 use Encode; $val = decode "euc-jp", $val; eval decode "euc-jp", '$val =~ tr/0-9A-Za-z@._-/0-9A-Za-z@._-/'; if($@) { エラー処理 } $val = encode "euc-jp", $val; JcodeはEncodeのラッパーなので、おそらくJcode内部では上記と同じような処理が行われています。ただし、既にJcodeを多用されているようなので、Jcodeで解決できればそれでいいとは思います。 文字化けの可能性は他にも沢山あり、今回の全角スペース+カタカナは氷山の一角です。No.9さんの「J(j)code::tr を使う方が良いかもしれませんね。」は、そのことも指しています。

noname#223023
質問者

お礼

ryu_chanさん ご回答ありがとうございました。 use Encode;を使うといいんですね! 今後のためにも調べてみます! 文字化けについては、これを使うと完璧!というのがないんですね。。 日本語はめんどくさいですね。。(笑) でも色々と勉強になりました! 皆様ありがとうございました!

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.8

> &Jcode::tr(\$val, '0-9A-Za-z-@._', '0-9A-Za-z-@._'); ↓ &Jcode::tr(\$val, '-0-9A-Za-z@._', '-0-9A-Za-z@._'); 見落としていたのですが、可能性としてハイフンの位置が悪いのかもしれません。置換文字列 '0-9A-Za-z-@._' の z と @ の間の - がエラーの原因になっている可能性があります。ハイフンを先頭または末尾に移動して試してみてはどうでしょうか? http://d.hatena.ne.jp/hiratara/20071226/1198685671 ネット上では Jcode の tr() はハイフンに弱いという情報があります (上記 URL)。面倒ですが、小分けにして書いてみてはどうでしょうか? 1つずつ追加しながら実行してみると、どこでエラーが発生しているのか分かるかもしれません。 $j = Jcode->new(\$val); $j->tr('0-9', '0-9'); $j->tr('A-Z', 'A-Z'); $j->tr('a-z', 'a-z'); $j->tr('@._', '@._'); $j->tr('-', '-');

noname#223023
質問者

お礼

kumozさん ご回答ありがとうございました。 &Jcode::tr(\$val, '-0-9A-Za-z@._', '-0-9A-Za-z@._'); ↑これで試させて頂いたところ、この部分で同じくInternet Server Errorになってしまいました。 $j = Jcode->new(\$val); $j->tr('0-9', '0-9'); $j->tr('A-Z', 'A-Z'); $j->tr('a-z', 'a-z'); $j->tr('@._', '@._'); $j->tr('-', '-'); ↑こちらはエラーにはならなかったのですが、特に変換されずにスルーされていました。 何か根本的におかしいのでしょうか。。。(泣 他に確認するところがありましたら教えてください。 よろしくお願いいたします。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.7

> &jcode::tr(\$val, '0-9A-Za-z-@._', '0-9A-Za-z-@._'); 手元にテストできる環境がないので誤っているかもしれませんが、Jcode.pm では最初を大文字にして &Jcode::tr をまず試してみてください。(ちなみに、jcode.pl では最初の文字が小文字で &jcode::tr を使う。) 上記の方法を試してもダメな場合は、オブジェクト指向のやり方もあります。 $j = Jcode->new(\$val); $j->tr('0-9A-Za-z-@._', '0-9A-Za-z-@._');

noname#223023
質問者

お礼

kumozさん ご回答ありがとうございました。 はい、大文字にしてもダメだったのですが、もう一つ教えて頂いたコードを試してみましたがダメでした。(泣 もし他にやり方がありましたら教えてください。 よろしくお願いいたします。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.6

> #全角半角処理 > $val =~ s/\@/\@/g; > $val =~ s/\./\./g; > $val =~ s/\_/\_/g; > $val =~ s/\-/\-/g; EUC-JP では第1バイトと第2バイトに重複したコードが使われるので、上記のような正規表現は文字化けの危険が伴います。Jcode には tr() 関数が付属していまず。下記の URL に使い方が書いてありますので、参照ください。 http://mikeneko.creator.club.ne.jp/~lab/kcode/jcode.html http://openlab.jp/Jcode/Nihongo.html

noname#223023
質問者

お礼

kumozさん ご回答ありがとうございました。 教えて頂きましたサイトを見て、 このようにしてみましたが、エラーになってしまいました。。 このコードではいけないのでしょうか。。(泣 &jcode::tr(\$val, '0-9A-Za-z-@._', '0-9A-Za-z-@._'); ちなみに、Jcode.pmを使っています。

  • petita
  • ベストアンサー率53% (8/15)
回答No.5

$val=~s/\xA1{1}\xA5/\x2E/g;

noname#223023
質問者

お礼

petitaさん ご丁寧にありがとうございました。 早速試してみましたが、教えて頂いたコードを入れてみますと、 今度は全角スペース後のカタカナが文字化けしてしまい、戻ってしまいました。(泣 もちろん、このコード↓ $val =~ s/\./\./g; は削除しています。 この1行を入れるだけではダメなのでしょうか。 ちなみに、Jcode.pmを使っています。

  • petita
  • ベストアンサー率53% (8/15)
回答No.4

「 $val =~ s/\./\./g; 」 のところが原因です。 EUC-JP文字セットでは、全角空白は 「\xA1\xA1」、全角ピリオドは [\xA1\xA5]、全角カタカナの1バイト目は「\xA5」 だからです。

noname#223023
質問者

お礼

petitaさん ご回答ありがとうございました。 確かにその部分をコメントアウトしたら、カタカナが文字化けせずに表示されました! ありがとうございました! ちなみに、この場合はピリオドの変換はどのようにするのが良いのでしょうか。 良かったら教えてください。よろしくお願いいたします。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

>全角カタカナの場合、全角スペースの後に続くと文字化けしているみたいです。  これは経験がないのでわかりませんが、ありえない動作です。  該当するフォームと、Perlの処理部分、おび出力HTMLを見ないとなんとも・・  ローカルでテストできれば、それぞれの時点で print ERROR "line 152:$_\n"; とでもして、その時点での値を出力してみるとか・・

noname#223023
質問者

お礼

ORUKA1951さん ご回答ありがとうございました。 petitaさんがご回答してくださいましたが、ピリオドの変換が良くなかったみたいです。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

>全角スペースとカタカナが続いているのが良くないみたい と >文字コードはEUCを使っています。 は矛盾してますけど。  EUCには半角カタカナはないです。EUC-JPにはありますが、それでも下記の問題を含んでいます。 EUC-JP ( http://ja.wikipedia.org/wiki/%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A#EUC-JP )  そもそも半角カタカナをHTMLに記述することには無理があり、半角カタカナを全角カタカナに変換するか、HTMLをUTF-8にするか、数値文字参照( HTML4 で使える文字実体参照 ( http://www.ne.jp/asahi/minazuki/bakera/html/reference/charref ) の下のほう)で記述することになるでしょう。  詳しい処理については、 Perlメモ ( http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP )の「日本語を扱う」の項目をご覧ください。  ま、Perl5.8以降なら、UTF-8に対応しているので、UTF-8で完結したほうが良いでしょう。(ライブラリは使わなくてすむ)

noname#223023
質問者

お礼

ORUKA1951さん ご回答ありがとうございました。 半角カタカナが入力された場合は全角カタカナに変換するようにしているので、 半角の場合は問題ないのですが、全角カタカナの場合、全角スペースの後に続くと文字化けしているみたいです。 ちなみに半角スペースの後の全角カタカナは文字化けしないようです。 他の入力フォームでも使っているので、出来たらEUCの文字コードのまま使いたいのですが、UTF-8にした方がいいでしょうか。。

回答No.1

フォーム画面およびCGIともにEUCなら、全角スペース関連で化けるということはあまりないような気がします。 CGI側でフォームから送られたデータを変数に格納している部分があると思いますが、そのライブラリなどは何をお使いですか?そのあたりからヒントが得られるかもしれません。 まずは全部でなくていいので、入力データのデコード部分と実際の表示部分のソースを見せていただくことは可能ですか?

noname#223023
質問者

お礼

gadgetwatchさん ご返答ありがとうございました。 全角スペースの後にカタカナ、 半角スペースの後にカタカナ、 スペース無しの後にカタカナ で調べてみたら、全角スペースの後にカタカナの時のみ文字化けしていました。 日本語処理ライブラリはJcode.pmを使っています。 デコード部分です。 $val =~ tr/+/ /; $val =~ s/%([0-9a-fA-F]{2})/pack("C",hex($1))/eg; if($opt){ #英数字全角半角処理 $a = qr{(?<!\x8F)}; $b = qr{(?=(?:[\xA1-\xFE][\xA1-\xFE])*(?:[\x00-\x7F\x8E\x8F]|\z))}x; $val =~ s/$a\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$b/pack("C", ord($1) - 0x80)/oeg; #全角半角処理 $val =~ s/\@/\@/g; $val =~ s/\./\./g; $val =~ s/\_/\_/g; $val =~ s/\-/\-/g; 表示部分は、 &Jcode::convert(\$text, 'euc'); HTMLに加工したものをEUCにして表示するようにしています。 (あまり必要ないかもしれませんが。。) これで足りますでしょうか。 よろしくお願いいたします。

関連するQ&A

  • .cgi でタグが勝手に変換されました。文字化け?でしょうか?

    .cgi でタグが勝手に変換されました。文字化け?でしょうか? Firefoxブラウザで表示すると、変になりました。 ブラウザでのソースをみると、一部だけが文字化けしていました。 実際のソースは問題ありません。 何故、ブラウザが正しく表示されないのでしょうか? ------------------ #! /usr/bin/perl print <<HTML; からHTMLを挿入しました。 <strong>全角スペースの後にTV</strong> の TV</ の部分だと思いますが消えて、 当然、その後の文字が全部太字(<strong>)が適応されちゃいました。 全角スペースを使ってはいけないのでしょうか? 何故こうなっちゃったんでしょうか? 他の全角スペースは問題ありませんでした。

    • ベストアンサー
    • CGI
  • cgiスクリプトの文字化け

    既存のCGIライブラリ(cgi-lib.plとjcode.pl)を用いて、登録フォームを作りました。しかし、「入力」を押して、CGIを作用させると、文字化けがおこってしまいます。 cgiのなかで、文字コードをeucに変換しています。(jcode::convert機能)サーバーのCGI設定は全て確認しましたし、パーミッションも確認しています。文法などはあってると思いますし、ディレクトリ、文字コード(euc)・改行コード(LF)も確認しています。 他に原因があると思うのですが、回答よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • PerlのCGIで全角スペースを入れて

    PerlのCGIで全角スペースを入れて print <<HTML; <p>完了  ボタン  次へ<br> <input type="submit" value=" 完了 &gt; "></p> HTML 隙間をあけて見やすくするのに全角スペースを入れていますが ブラウザで表示したときに(charset=Shift_JIS") どんな時に文字化けするのか忘れたのですが どんな時に文字化けするのでしょうか?

    • ベストアンサー
    • CGI
  • 「塙」と言う文字が文字化けしてしまう

    表題の件で質問させて下さい。 PHPで文字コードをEUCにしたwebアプリケーションを構築しております。 特に何の問題もなく動いていたと思っていたのですが、フォーム等で「塙」と言う文字を入力して、submitした値を表示させると文字化けしてしまいます。 これを表示させるには、どのような対処を行えば良いのでしょうか? いろいろと試してみた結果、 「塙あ」のように、後ろに全角文字が入るとキチンと文字化けせずに表示されるのは確認しました。 (「塙1」のように後ろに半角文字があると「?1」になってしまいます) どなたか対策をご存知の方、いらっしゃいましたらご教授お願いします。 下記の対策は行っています。 ・header("Content-type: text/html; charset=EUC-JP"); ・<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> ・ファイルをEUC-JPで保存

    • ベストアンサー
    • PHP
  • CGIから出力される文字が化けて表示される

    メールフォームのCGIが出力するHTMLがブラウザで正常に表示されません。 HTMLで書いたメールフォームから、CGIを使って指定メールアドレスに文面を送信するページを作っています。 CGIとメールフォームは、ページを設置するレンタルサーバのサポートから入手した、公式のバージョンに手を加えて使っていますが、動作中に表示されるページの一部が文字化けする障害が発生してしまいます。 状況は下記の通りです。 1.フォームの送信ボタンを押すと、内容確認を促すページにジャンプ、もし入力漏れがあれば   警告ページにジャンプするのですが、どちらにジャンプしても表示が化けてしまいます。 2.文字コードを確認すると、CGIから出力されたHTMLが欧文(ISO)形式として認識されています。 3.CGIと、呼び出しに使っているHTMLはEUC形式で保存されているので、表示モードをEUCに   切り替えると、正しい内容で表示されます。   また、実際にメールを送信すると、受信メールも正常に送られています。 4.送信が正常に済むと、その旨を確認するページが表示されるのですが、そのページは正しく   表示されます。(文字化け表示のまま遷移しても、正しく表示されます) 5.文字化けしているページのソースを確認すると、一応charasetでコードがEUCに定義されている   ようなのですが、ブラウザ側では認識されていないようです。 画面の遷移を整理しますと、【フォーム】>【確認/警告】>【送信完了確認】となりますが、真ん中にある「確認/警告」の両ページのみが文字化けする、という感じです。 何か対応方法をご存知でしたら、ご教授頂けますでしょうか。 よろしくお願い致します。

    • 締切済み
    • CGI
  • 文字コードEUCのPerlプログラムが文字化けしてしまいます

    Perlで書かれたCGIを実行しようとしているのですが、プログラムはEUCで記述されているそうです。nkf -g ***とするとEUC-JPとなります。 print " <META http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n"; とも記述されているのですが、ブラウザで実行(閲覧)すると文字化けして、ブラウザのエンコードは、Unicode(UTF-8)になっています。 ちなみに、OSはCentOS5.2です。 どうやったら、EUCで記述されたCGIが文字化けせずに実行できるのでしょうか? teratermでサーバに接続語、viコマンドで表示しても文字化けしています。ファイルの文字コードをEUCからUTF-8にして(nkf -w ***)、ブラウザでアクセスしても文字化けしてしまいます。

    • ベストアンサー
    • Perl
  • CGIプログラムを使った申し込みフォームをHTML形式のメールで送りました。ソースを開くと文字化けしてしまいます。

    CGIプログラムを使うことにより、WEB上から申し込みフォームを使って入力事項をHTML形式によりメールしました。しかし、ソースを開いてみると文字化けしています。 CGIプログラムは、Shift JIS で保存したものを送信しているのですが。。 どうすれば、文字化けしない、きれいなソースが見れるようにできるでしょうか?

    • ベストアンサー
    • CGI
  • 自作cgiのページがIE10で文字化けする

    Perlでcgiのページを作っています。文字コードはEUCです。 最近、IEのバージョンを8から10にアップグレードしたのですが、 自分の作ったページが、たまに文字化けするようになりました。 IE10のエンコード設定は「自動選択」にしていますが、 自動で「西ヨーロッパ言語(ISO)」に判断されてしまいまうことがあります。 Perlのcgiの文字コードはEUCで、ソースには以下のようにEUC-JPを指定しています。 <meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"> 手でIE10の文字コードをEUCに設定すれば文字化けは直るのですが、 数日経つとまた同じように文字化けで「西ヨーロッパ言語(ISO)」に自動判断されてしまいます。 metaでEUC-JPをしていればブラウザ側で自動判断してくれると思っていたのですが、違うのでしょうか? HTMLでmeta以外に文字コードを指定するところがあるのでしょうか?

    • ベストアンサー
    • Perl
  • メール送信後のHTMLが文字化けします

    FORMからsendmailを利用してメールを送信し、その結果を「送信できた」、「未入力項目がある」などを出力するHTMLとして出力するcgiを作ったのですがHTML出力が文字化けします。 メールのsubjectやbodyは文字化けせず正常に送信できます。HTMLにはMETAタグでeuc-jpやshift_jisと色々とトライしました。cgiもshift_jisとeuc-jp両方で試しましたがどちらも文字化けします。文字化けしているときにブラウザのエンコードで自動選択すると、ブラウザがcgiの使用コードに自動的に合わせてくれて正常に表示してくれますがこれがcgiを起動するたびで面倒です。エンコードを自動選択しないと文字化けしてそのときのブラウザが選択している文字コードは「西ヨーロッパ言語(ISO)です。 どうしたらブラウザに使用している文字コードを認識させるられるでしょうか?

    • ベストアンサー
    • CGI
  • DreamWeaverでEUCが文字化けする。

    DreamWeaverを使ってホームページを作っています。 最初S-JISでHPを作っていたのですが、CGIページを作る際にEUC-JPの方日本語の文字処理上都合が良かったため、CGIページをEUC-JPにしました。 そこで今までDreamWeaverで作った他のページもテキストエディタで 文字コード EUC-JP、 改行コードをUNIX形式、 HTML中のcharset=EUC-JP にしたのですが、今度はDreamWeaver上で日本語が文字化けするようになってしまいました。 DreamWeaverで普通にEUC-JPが文字化けせずに表示させるには一体どのようにしたらよろしいのでしょうか。 ご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。

専門家に質問してみよう