• 締切済み

機種依存文字の文字化けについて

PHPでのはしご高(髙)や立ち崎(﨑)などの機種依存文字の文字化けについてです。 まだ経験が浅いものですからアドバイスしていただけるとありがたいです。PHP関連で機種依存文字の文字化け解消方法をいろいろ調べ、大抵は文字コードをSJIS-winにすると治ったと書いてあり検証してみましたが・・・・結局うまくいきませんでした。試しに以下の通りフォームから受け取る値($_REQUEST)を確認してみると、機種依存文字「髙」だけの場合と、そうでない「野原」の場合はきちんと挙動しているのですが、「髙野」のように混ざったパターンをすると化けてしまいます。この段階で理由が分からずとまっています。説明不足とは思いますがどうかよろしくお願いします。 <?php mb_convert_variables("SJIS-win", "SJIS-win,cp51932,UTF-8,JIS,ASCII,EUC-JP", $_REQUEST); print_r ($_REQUEST); ?> <html> <head> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <br><br> <FORM method="POST" action="<?=$PHP_SELF?>"> 名前<INPUT size="25" type="text" style="ime-mode:active" name="name"> <INPUT type="submit" name="check" value=" 確認する"> </FOAM> </body> </html>

みんなの回答

  • 23468
  • ベストアンサー率66% (6/9)
回答No.3

私の環境でやってみたら、問題なく表示できました。 php.ini の mbstring の項目を全部晒してもらった方が、特定しやすいかもしれません。 因みに私は、以下の設定で検証しています。 [ php.ini - mbstring ] mbstring.detect_order auto mbstring.encoding_translation Off mbstring.func_overload 0 mbstring.http_input auto mbstring.http_output pass mbstring.internal_encoding UTF-8 mbstring.language Japanese mbstring.strict_detection Off mbstring.substitute_character no value [ test.php ] <?php ini_set('mbstring.http_input' , 'pass'); ini_set('default_charset' , 'SJIS-win'); ini_set('mbstring.internal_encoding' , 'SJIS-win'); ini_set('mbstring.http_output' , 'SJIS-win'); // 上記4行で、php.ini の設定を上書きしている mb_convert_variables("SJIS-win", "SJIS-win,cp51932,UTF-8,JIS,ASCII,EUC-JP", $_REQUEST); print_r ($_REQUEST); ?> <html> <head> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <br><br> <FORM method="POST" action="<?php echo $PHP_SELF ; ?>"> 名前<INPUT size="25" type="text" style="ime-mode:active" name="name"> <INPUT type="submit" name="check" value=" 確認する"> </FORM> </body> </html> -- (セキュリティ云々の話をすれば、そもそもShift-JISを使うこと自体避けた方がいいんですけど、それはまた別のお話。)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

ご質問の条件での文字化け原因として3種類考えられます 1.WEBサーバーの入力設定不備  php.ini にて mbstring.http_inputの設定でIBM拡張文字を使えない文字コード  が使用されていると勝手に変換されるため文字が化けます その場合は、mbstring.http_input = pass に変更して試してください 2.内部処理コードのとの不整合 この場合は、以下のような処理を追加してみてください ini_set('default_charset' , 'SJIS-win'); ini_set('mbstring.internal_encoding' , 'SJIS-win'); ini_set('mbstring.http_output' , 'SJIS-win'); 3.WEBサーバーは正しく処理しているがブラウザが文字コードを識別できない その場合は PHPスクリプトの出力に文字コードを指定するヘッダーを追加出力 してみてください。

wakamako
質問者

補足

ありがとうございます。 実際に以下の通り追加して動かしてみたのですがやはり現象は同じでした。 (機種依存文字だけだと文字化けすることなく、普通の文字と混ぜると化ける) ini_set('mbstring.http_input' , 'pass'); ini_set('default_charset' , 'SJIS-win'); ini_set('mbstring.internal_encoding' , 'SJIS-win'); ini_set('mbstring.http_output' , 'SJIS-win');

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

(1)headerを設定してみる header("Content-Type:text/html;charset=sjis-jp"); (2)使用言語を明示してみる mb_internal_encoding("SJIS-win"); ちなみにきょうび$PHP_SELFを使うのはセキュリティ的に時代遅れ php.iniのregister_globalesがonになっているならoffに変更しましょう 原則$_SERVER["SCRIPT_NAME"]をつかってください。

wakamako
質問者

補足

ありがとうございます。 実際にヘッダーを追加して以下のようにしました。 ですが現象は同じでした。何が問題のか検討つかず・・・ header("Content-Type:text/html;charset=sjis-jp"); ini_set('mbstring.http_input' , 'pass'); ini_set('default_charset' , 'SJIS-win'); ini_set('mbstring.internal_encoding' , 'SJIS-win'); ini_set('mbstring.http_output' , 'SJIS-win');

関連するQ&A