• 締切済み

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

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>

  • PHP
  • 回答数3
  • ありがとう数0

みんなの回答

  • 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

  • 機種依存文字

    いつもお世話になっております。 機種依存文字について質問させていただきます。 CSVファイルをアップロードして、文字コードがEUCのデータベースに 格納したいと思っております。(PHPの文字コードもEUCになっております。) 「(はしごたか)」「(たつさき)」などの機種依存文字が 文字化けをしてしまいます。 $name = mb_convert_kana(mb_convert_encoding($data[1], "EUC-JP", "Shift-JIS"), "KV") $name = mb_convert_kana(mb_convert_encoding($data[1], "eucJP-win", "Shift-JIS"), "KV") としても文字化けをしてしまいます。 また、以下の設定をしても文字化けは解消されません。 ini_set('default_charset', 'eucJP-win'); ini_set('mbstring.http_output', 'eucJP-win'); ini_set('mbstring.internal_encoding', 'eucJP-win'); 皆様、ご提示お願いいたします。 よろしくお願いいたします。 <環境> OS:Red Hat Linux PHP:Version 4.3.1 DB:MySQL 3.23.56

    • ベストアンサー
    • PHP
  • 機種依存文字が?になる

    HTML_QuickFormを利用してフォーム送信しているのですが 受信したメールを見ると特定の文字が?になってしまい 文字化けをしてしまいます。 具体的にはメールで確認した際に<input type="text" ・・・>に 入力した半角カタカナと機種依存文字が?に変わっておりました。 php,tplファイルは全てutf-8で保存されphpのソースは以下のようになっております。 header('Content-Type: text/html; charset=utf-8'); mb_language('Japanese'); mb_http_input('UTF-8'); mb_http_output('UTF-8'); mb_internal_encoding('UTF-8'); require_once 'HTML/QuickForm.php'; require_once 'HTML/QuickForm/Renderer/ArraySmarty.php'; require_once 'Smarty/Smarty.class.php'; $to = 'mail@ad.com'; $form = new HTML_QuickForm('inq', 'post'); $form->addElement('text', 'name', '名前', array('class' => text)); $form->addElement('text', 'ad', '住所', array('class' => text)); $form->addElement('textarea', 'msg', 'コメント', array('rows' => 8, 'cols' => 30)); $value = $form->getSubmitValues(); if (isset($value['accept'])) { $subject = '連絡'; $message = <<<EOD 【名前】 {$value['name']} 【住所】 {$value['ad']} 【メッセージ】 {$value['msg']} 【メッセージ】 {$value['msg']} EOD; mb_send_mail($to, $subject, $message, "From: {$value['連絡']}"); $form->freeze(); ~略~ 半角カタカナの件は $message = mb_convert_kana ($message, 'K'); とし解決したのですが機種依存文字の解決策が見つからず自分なりに なんとか調べてみたところ下記のurlがみつかりました。 http://shimax.cocolog-nifty.com/search/2007/12/phpeucjputf8_f714.html utf-8では機種依存文字が?になるのは当たり前のことなのですね。 これを応用しなんとかできるかと思い下記のようにしてみたのですが 結果は同じでした・・・ $message = mb_convert_encoding(mb_convert_encoding($message,"sjis-win","UTF-8"),"UTF-8","sjis-win"); どのようにすれば解決できるものなのでしょうか? 宜しくお願い致します。

    • 締切済み
    • PHP
  • POSTしたデータの文字コードがutf-8になる

    ヘッダーで文字コードをSJISになるように <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> と設定し、ボディ側のformで <form method="post" action="xxxxx"> <input type="text" name="n" value=""> <INPUT type="submit" value="実行"><br /> </form> とすると、サーバ側で受け取ったname="n"がutf-8になっています。 PHPですが、受け取った文字を echo mb_convert_encoding($_POST["n"],"SJIS","utf-8"): とSJISに変換し、表示すると、文字化けなく表示可能なのですが、そのままでは文字化けてしまいます。(表示側のHTMLも文字コードは上記と同様にヘッダーで文字コードを指定しSJISにしています。) 何が悪いのでしょうか?(特殊な環境としてはchrome+jquery mobileを使用しています。) よろしくお願いします。

    • ベストアンサー
    • HTML
  • htmlが文字化け

    掲題の件について質問させて頂きます。 linuxサーバ(CentOs5)を立ち上げて、apacheをインストールし、DocRootにhtmlファイルをFFFTPにてアップロードした所、文字化けが発生してしまいました。(画面が真っ白になります) 【環境】 Server: Apache/2.2.6 (Unix) mod_ssl/2.2.6 or_log PHP/5.1.6 【アップロードしたファイル内容】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>ここにタイトルを挿入</title> </head> <body> <form method="post" action="input_check.php" name="input_check"> <input type"text" name="name">お名前: <input type"text" name="furigana">ふりがな: <input type="submit" name="send" value="submit"> </form> </body> </html> ファイルはEUC-JPにて記述しています。 以下試した点をあげてみます。 1. charsetをShift_JISに変更。 ⇒ファイルがEUC_JPで書かれているので当然文字化け。ですが文字化けされた文字は表示されました。(画面が真っ白ではないです。) 2. apacheのhttpd.confのAddDefaultCharsetをコメントアウト ⇒(というよりデフォルトで設定されていませんでした。) 他に何か怪しまれる点はありますでしょうか? 以上宜しくお願い致します。

  • [HTML-PHP]あるPHPファイルだけ文字化け

    お世話になります。 XP/PHP5.2.9/Apache2.2.11 の環境で、簡単なシステムを作っているのですが、その際に PHP側で header( "Content-Type: text/html;charset=shift_jis"); HTML側で <meta http-equiv="content-type" content="text/html; charset=shift_jis"> と明示的にSJISにしているのですが、実際にローカルで確認すると文字化けしてしまうPHPファイルがあります。(1ファイルのみ) 他のPHPファイルは同様のヘッダー情報を送信していますが、文字化けせずに画面出力されています。 HTML-PHP初心者のため、補足等必要になるとは思いますが、どうぞご教授下さい。

    • ベストアンサー
    • PHP
  • 携帯での文字化け

    PCサイトと携帯サイトを同じファイルで作成しています。 アップロードしたファイルは全てsjisで保存し、<Meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> というタグも入れているのですが、一部の携帯では文字化けがおこっているようです。 私自身の携帯(docomo)では文字化けはおこっていないので、大丈夫だと思っていたのですが……。 それぞれの携帯会社のホームページを見た結果、文字コードはsjisがいいだろうと判断したのでそのようにしています。 文字化けの原因が分からなくて困っています。 どうすれば全ての携帯で文字化けしないようにできるのでしょうか?

  • 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
  • ファイルをアップロードすると文字化けしてしまう。

    PHP初心者です。カテゴリで同じような質問を捜したのですが見つからず、質問させて頂きました。よろしくお願い致します。 windowsXPでPHP4.4.4+MYSQL+Apacheを使用しており、PHPの内部コードはEUC-JPで出力はSJISです。 写真のアップロードとコメントをつけたいと思い本を見ながら↓を作成したのですが、 写真(ファイル名)&コメントをブラウザで表示すると文字化けしてしまって困っております。 どうすれば文字化けせずに表示できるようになるか教えて頂ければと存じます。 ※up.php(写真の選択&コメントをする画面です) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>登録</title> </head> <body> <form action="kakuninn.php" name="make1" method="post" enctype="multipart/form-data"> <p> <input name="image1" size="40" type="file"> <input type="image" name="image_up" src="../img/upload.gif" alt="アップロード"> </p> <p>コメント</p> <p> <input name="kome" type="text" value="" maxlength="50"> </p> <p> <input type="submit" name="Submit" value="送信"> </p> </form> </body> </html> ※kakuninn.php(ファイル名とコメントを確認する画面です。) <?php print("文字コード(画像):".mb_convert_encoding($image1,"auto")."<br>"); print("文字コード(コメント):".mb_convert_encoding($kome,"auto")."<br>"); print("画像:".$image1."<br>"); print("コメント:".$kome."<br>"); ?> 例えば、写真欄に「写真1.jpg」、コメント欄に「コメント」として、送信ボタンを押すと↓の結果となります。 文字コード(画像):C:\WINDOWS\php24A.tmp 文字コード(コメント):?R?????g 画像:C:\WINDOWS\php24A.tmp コメント:?R?????g

    • 締切済み
    • PHP
  • 特定の文字が文字化けします

    こんにちは。 とても困ってます。 例えば、phpで echo "<P><FORM ACTION=\"main.php\">"; echo "<METHOD=POST>"; echo "<INPUT TYPE=HIDDEN NAME=res VALUE=\str_request\">"; echo "<INPUT TYPE=HIDDEN NAME=action VALUE=post>"; echo "<TEXTAREA NAME=\"str\" ROWS=\"8\" COLS=\"50\"></TEXTAREA>"; echo "<INPUT TYPE=\"submit\" VALUE=\"send">"; echo "</METHOD></FORM></P>"; と記述して「send」ボタンを押下して文字列をPOSTした場合、 受け取った文字($str)の特定の文字が文字化けします。 特定の文字とは、「る」「れ」「ろ」などです。 どなたか原因がわかる方いらっしゃらないでしょうか?

    • 締切済み
    • PHP
  • 文字化けを解決したい

    サイトを持つ管理人です。タグなどについてはかなり初心者です。 iPhoneなどの海外OSから閲覧すると文字化けしてしまうという報告を受けて、タグを色々いじっています。 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">を追加してみたのですが、これ単品だと私のPCから閲覧したときに文字化けしてしまいました。 そのため<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">と<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">を並べてみたのですが、これで海外OSからも文字化けを起こさなくなったのでしょうか? こんな感じのタグです↓ <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <META NAME="GOOGLEBOT" CONTENT="NOINDEX, NOFOLLOW,NOARCHIVE"> <META NAME="ROBOTS" CONTENT="NOARCHIVE,NOINDEX,NOFOLLOW"> <meta name="viewport" content="width=380, maximum-scale=1.6" /> <title>練習</title> </head> 全てのスマホからもサイトを閲覧出来るようにするにはどうしたら良いでしょうか?それとも、全てのスマホから文字化けを防ぐことは不可能なのでしょうか? お知恵をお貸しください。

専門家に質問してみよう