• ベストアンサー

sjisでの文字化け?

フォームに文章を入力し内容を送信するCGIを組んだのですが、送信内容の確認画面において文字化けが生じました。 よく聞く「表示」などの文字化けとは違う文字で、「欲求不満」「早苗」などで発生しています。 ただ、「欲求」「不満」「早」「苗」では文字化けせず、「求不」「早苗」という単語になって初めて文字化けするようです。 送信内容はsjisに変換して処理しています。 これはどういったことが原因で発生するのでしょうか? 原因と解決法を御教示いただけたらと思います。

  • ato10
  • お礼率33% (1/3)
  • Perl
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
noname#22650
noname#22650
回答No.3

>このCGIに送った場合はしっかりと「欲求不満」と表示されました。 と言う事でしたら、CGIプログラムに問題がありそうですね。 フォームから受け取った文字列を処理している部分をチェックしていくしかないでしょう。 どこかで内容を書き換えてしまっていると思います。

ato10
質問者

お礼

1つ1つプロセスを検証した結果、原因が分かりました。 途中の禁止ワード処理で誤って書き換えが生じてしまっていたようです。 アドバイスありがとうございました!

その他の回答 (2)

noname#22650
noname#22650
回答No.2

GCIを作ってみて検証しましたが、私の環境では文字化けは再現できませんでした。 下記のCGIは受け取ったデータを表示するだけのCGIです。 もしお時間が有れば、フォームの送信先をこのCGIに置き換えてみて下さい。 このCGIでは正しく表示されますか? #!/usr/local/bin/perl print "Content-Type: text/html\n"; print "\n"; print "<html><head>\n"; print "<meta http-equiv='Content-Type' content='text/html; charset=SHIFT_JIS'>\n"; print "</head><body>\n"; %argv = &read_argv(); print "</body></html>\n"; exit; sub read_argv(){ my($buf,@pair,%argv,$key,$value); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } #POST or GET された生データ print "生データ<br>$buf<br>"; @pair = split(/&/, $buf); print "デコード後<br>"; foreach (@pair) { ($key,$value) = split(/=/,$_); $argv{&url_decode($key)} = &url_decode($value); #デコード後のデータ print &url_decode($key)." = ".&url_decode($value)."<br>"; } return %argv; } sub url_decode(){ my($data) = shift; $data =~ s/\+/ /g; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg; return $data; }

ato10
質問者

補足

お手数をおかけします。 このCGIに送った場合はしっかりと「欲求不満」と表示されました。

noname#22650
noname#22650
回答No.1

もう少しヒントを下さい。 文字列を処理している部分のソース 「欲求不満」「早苗」が実際どう表示されたのか? 送信側のHTMLの文字コード CGIのソースの文字コード 表示側のHTMLの文字コード ちなみに、私の場合文字化け対策として行っているのは、 ・CGIは全てEUCで書く ・フォームから受け取った文字列は必ずEUCに変換する ・HTMLに出力する直前でSJISなど、目的のコードに変換する

ato10
質問者

補足

御返答ありがとうございます。文字化けですが、  「欲求不満」→「欲・s満」  「早苗」→「・c」 という具合になります。 文字コードは送信側・ソース・表示側共にS-JISです。

関連するQ&A

  • 【Redhat】SJISにおける文字化け

    OS:Redhat Linux ES 4.6 文字コードをSJISにしてファイルを表示しますと、特定の日本語文字(例えば、II)が 文字化けしてしまいます。 何が原因なのでしょうか。。。

  • フォームメールが文字化け

    アングラーズネット社の「インターネットショップCGI&受注管理」という書籍に付属されている「fmail」というCGIファイルを使ってメールフォーム作成してサイトにアップロードしたのですが、メール送信確認画面で文字化けします。そのメールフォームで受信したメールも文字化けしています。AdobeGoLiveCS2でホームページを作成しています。最初GoLiveでCGIファイルを読み込むとファイル内容が文字化けになっていたので、エンコーディングを日本語シフトjisに設定すると文字化けが解消されました。しかし、相変わらずメールフォーム及び受信メールは文字化けしたままです。 OSはWindowsXPです。 アドバイスよろしくお願い致します。

  • UTC-8→SJISで文字化け

    こんにちわ!宜しくお願い致します。 現在、オープンソースのアンケートシステム「limesurvey」におきまして、文字化けが起きており困っております。 LimeSurveyバージョン 1.90+ Build 9046 ほとんどのところは、きちんと日本語表示されるのですが、グラフ内(pchart)の文字が文字化けします。 いろいろネットで調べて、imagettftextが原因と分かりました。 「JIS-mapped Japanese Font Support」の設定値がTRUEの場合、GDライブラリは渡された文字列をUTF-8ではなく、Shift_JISとして解釈するということが分かり、mb_convert_encoding関数であらかじめShift_JISに文字コード変換してから、imagettftext関数に渡したところ基本的には、文字化けが解消しました。 以下が、そのコードです。 $Value2 = mb_convert_encoding($Value2,"SJIS ","UTF-8"); しかしながら、「(1)(2)(3)」(←まる1、まる2、まる3)などの機種依存文字がどうしても「?」に変換されてしまいます。 Shift_JISには、「(1)(2)(3)」などの機種依存文字が無いので仕方がないのですが、何とか良い方法が無いでしょうか? ちなみにネットで調べたところ、「SJIS」ではなくて、「SJIS-win」で変換すれば文字化けが起こらないと分かりましたが、今度は、imagettftextでエラーが出てしまいます。 下記のコードはエラーになります。 $Value2 = mb_convert_encoding($Value2,"SJIS-win ","UTF-8"); 「JIS-mapped Japanese Font Support」の設定値がTRUEの場合でも、GDライブラリは渡された文字列をUTF-8として強制的に解釈させる方法など無いのでしょうか?その他何か良い方法があればお教え下さい。 以上、宜しくお願い致します。

    • 締切済み
    • PHP
  • CSSで作成したものに組み込むと文字化け

    ここで質問してよい内容でないかもしれませんが、 どのたか教えてください。フリーのCGIを使って(ですから、サポート がなく) テストを行いました。普通に組んでUPした場合は、 送信ボタンをおして、この内容で送信しますか? の文字がきちんとでましたが、それを無謀だと思いながら、 CSSで作ったものにはめこみました。その際、一部文字化けが 発生しました。ですのでCGIは動作していると思い。 文字コードに問題があるのでは?と、確認した所、 文字コードがUTF-8になっているのに対しCGI側はS-JIS になっていました。 これをどちらも変えてみたり試したのですが、 やはり文字化けしたままです。 まったくのド素人なので、無謀だとおもいましたが、 どなたか教えてください。

    • 締切済み
    • CGI
  • puttyの日本語版において、SJISファイルが文字化け

    (概要) puttyの日本語版をインストールしたのですが、SJISモードにしても、SJISのファイルを開いた際に、文字化けが発生してしまいます。 (詳細) (1)puttyの設定 ウィンドウ→変換においてSJISモードを設定 (2)サーバー上において、環境変数をLANG=ja_JP.ujisおよびLANG=ja_JP.SJISに設定 上記の設定(1)、(2)で、SJISファイルを開くと文字化けが発生します。 ちなみに、ウィンドウ→変換においてEUC-JPモードを設定し、環境変数をLANG=ja_JP.eucjpに設定した場合に、EUCのファイルを開いた際には、文字化けせずに表示できます。 原因および対処方法がお分かりになる方がいらっしゃいましたら、ご教示をお願いいたします。

  • 文字化け

    携帯サイトにcgiでつくられたフォームを設置したのですが、 自動返信で送られるメール(送信先はyahooアドレス)が PCでyahooメールをみると正常なのですが、同じメールを携帯版yahooからみると、全部文字化けしています。 どうすれば文字化けせずみれますでしょうか。 cgiはよくわかりません。PCサイトで問題なく動作しているものを使っていますが、配布元も分からず・・・

    • 締切済み
    • CGI
  • PHPのSJISからUTF-8への変換で文字化け

    いつもお世話になります。 PC用システムがあり、一部データを携帯電話からも更新したいと思い、既に稼働しているUTF-8のシステムに機能追加しています。 携帯はSJISのみとの事ですので、SJISで携帯用サイトを作成し、DBからデータの読込、表示など問題なくできるようになりました。 携帯サイトでHTMLフォームを作成しており、そこからDBへ書き込む際に、判る範囲ですが以下の文字が文字化けして登録されてしまいます。。 予→浴 ソ→メ 他にも文字化けしそうな感じなのですが、なぜ上記の特定文字だけ文字化けするのでしょうか・・・? 例えば 大阪 東京 名古屋 アップル などは一切文字化けせず問題ありません。 PHP自体はSJISで作成しており、DB登録時にmb_convert_encoding($txt,"UTF-8","SJIS")でUTF-8としています。 どなたかお詳しい方、ご教授のほど宜しくお願い致します<(_ _)>

    • ベストアンサー
    • PHP
  • MySQL5.1の文字化け

    多くの方が同様の質問をされていたのですが、一致する問題が見つけれなかったので、ご存じの方がおられたら教えて下さいm(_ _)m (環境)  PHP 5.2.8 ZendFramework 1.5.1 から Pdo Mysqlを使用  文字コード:SJIS  Mysql 5.1  文字コード:EUC-JP (質問内容) 携帯の絵文字データをSJISのバイナリでスクリプト中に埋め込むため、スクリプトの文字コードをSJISに統一したところ、文字化けが発生しました。 SET NAMES SJIS のSQLを発行することで表示は正しくできるようなったのですが、新たにレコードを追加しようとすると文字化けが発生します。 例)情報 → 情表 insertを行う前の文字コードをSJIS,SJIS-win,EUCと変えてみましたが、SJISもしくはSJIS-winの場合は上記の例のとおりとなり、EUCにすると完全な文字化けとなりました... おそらく登録時にMYSQLがSJIS→UTF8→EUCに変換される時に正しく変換されていないものと思われるのですが、どなたか対処方法をご存じないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 送信フォームの全角文字情報がcsvで文字化けしてしまうんですが…

    送信フォームの入力情報をcsvに蓄積するcgiで、 csvに情報はきちんと送られてきているのですが、 全角文字の部分がすべて文字化けしています。 ちなみに、このフォームは共通のcgiを使用して、 社内の同じサーバの複数のサイトに設置しているのですが、 文字化けするのは、ココログのブログ内の サイドメニュー部分に設置したフォームからの データだけのようです。 原因が推測できる方がいましたらよろしくお願いします。

    • 締切済み
    • CGI
  • sjisの文字化けとその対処方法について

    今掲示板を作っています。 sjisでは特定の文字(表・予・申・能など)が文字化けする問題がありますが、簡単に対処できる方法をさがしています。 一番やりたい方法が、str_replace()関数を使って、例えば「表」を「\表」と書き換える関数を作って、何か書き込むときにはテキストデータをその関数にかけてしのぐというものです。しかし、実際に下のようにやってみると、PHPエラーが発生します。 $textdate = str_replace("表","\表",$textdate); ちなみに、この文字が「表」以外の文字化けをおこさない文字ならばこのエラーは発生しません。 文字コードレベル(16進数レベル)で置換しなければならないのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう