アプリ版:「スタンプのみでお礼する」機能のリリースについて

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>

A 回答 (3件)

私の環境でやってみたら、問題なく表示できました。


php.ini の mbstring の項目を全部晒してもらった方が、特定しやすいかもしれません。

因みに私は、以下の設定で検証しています。

[ php.ini - mbstring ]

mbstring.detect_orderauto
mbstring.encoding_translationOff
mbstring.func_overload0
mbstring.http_inputauto
mbstring.http_outputpass
mbstring.internal_encodingUTF-8
mbstring.languageJapanese
mbstring.strict_detectionOff
mbstring.substitute_characterno 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を使うこと自体避けた方がいいんですけど、それはまた別のお話。)
    • good
    • 0

ご質問の条件での文字化け原因として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スクリプトの出力に文字コードを指定するヘッダーを追加出力
してみてください。

この回答への補足

ありがとうございます。
実際に以下の通り追加して動かしてみたのですがやはり現象は同じでした。
(機種依存文字だけだと文字化けすることなく、普通の文字と混ぜると化ける)

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');

補足日時:2011/01/16 03:10
    • good
    • 0

(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"]をつかってください。

この回答への補足

ありがとうございます。

実際にヘッダーを追加して以下のようにしました。
ですが現象は同じでした。何が問題のか検討つかず・・・

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');

補足日時:2011/01/16 03:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!