• ベストアンサー

【PHP】mb_convert_encoding()で "~" 等が化ける

PHP5.2.4 使用者です。(レンタルサーバー) 例えば、サーバー及び記述の文字コードがEUC-JPだとして、 $str = "~"; $str = mb_convert_encoding($str , 'UTF-8', 'EUC-JP'); とすると "?" に化けてしまいます。 調べたところ、マルチバイト文字の ~ ¬ ∥ - ¢ £ \ は対応するコードがないから化けるとか… "~" はよく使う文字ですし、そんな簡単に化けられては困るんですが… プロの方はこういうのどう処理してるのでしょう。 お詳しい方、よろしくお願いいたします。

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

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

euc-jp じゃなくてeucjp-win にしてみてください。 [php] mb_convert_encoding と UTF-8 の誤変換問題 ( しゃいん☆のブログ| 名古屋市 Webシステム開発 サーバ構築 ネットワーク構築 株式会社コネクティボ ) http://shain.blog.conextivo.com/2007/07/php_mb_convert_encoding_utf8.html 根っこが深い問題なんです。実は。 404 Blog Not Found:Encode - 規格のバグまでは直せません http://blog.livedoor.jp/dankogai/archives/50488765.html

ikataro
質問者

補足

なるほど!eucjp-win で解決しました。 ↓ウィキペディアによると規格作りの段階で勘違いがおきているようですね… http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C 今後は"EUC-JP"と記述すべき所は全て "EUCJP-win" でいこうかなと思いますがどうでしょうね? "EUCJP-win" を使ってはいけない場合ってあるんでしょうかね? ありがとうございました。

その他の回答 (2)

回答No.3

処理系にWindowsが混入してるとそういう現象が起こるらしいです ね。Windowsが波ダッシュと全角チルダを混同してることと、euc-jp には全角チルダなんて無いことが諸悪の根源とか。 どこかで全角チルダを波ダッシュに変換してやる必要があるわけで すが、適切な場所でeuc-jpのかわりにeuc-jp-winと唱えるのが効 くって噂です。

ikataro
質問者

補足

ありがとうございます。 >> 処理系にWindowsが混入 このWindowsとは次のどの段階なのでしょうかね? 1)サーバーのOS 2)プログラマーのパソコンのOS(私の場合Win-XP) 3)サイト訪問者のパソコンのOS 契約のサーバーはUNIX系なので 1) はないとして、 2) と 3) はどっちなのでしょうか。  もし 2) なら、私のPCがMacなら EUCJP-win はいらないことになりますし… 3) なら EUCJP-win は常時必須でしょうし…

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.1

$str = mb_convert_encoding( $str, 'EUC-JP', 'ASCII,JIS,UTF-8,EUC-JP,SJIS' ); ではどうですか。

関連するQ&A

  • mb_convert_encoding で?になる。

    $old = "名前"; $new = mb_convert_encoding($old,"EUC-JP","auto"); echo "$new"; 上のスクリプトを実行すると、’名前’が半角の’?’に なるんですよー。 何ででしょうか? ページもEUC-JPだし、phpもEUCです。 PHP Version 4.3.10で、php.iniの mbstring.internal_encodingはEUC-JPです。 OSは、テストなので自分のPCのw2kです。 mb_convert_encodingが実験的だからなのでしょうか? 他にも同じようになる物があるのでしょうか? 対処方法はあるのでしょうか?

    • ベストアンサー
    • PHP
  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • phpのmb_convert_encodingで文字化け

    phpのmb_convert_encodingで文字化け phpでmb_convert_encodingを使用してSJISよりUTF-8にエンコーディングしています。 ところが、“(”や“?”などが1文字目に存在すると文字化けしてしまいます。 どのような原因が考えられますでしょうか? お願いいたします。

    • ベストアンサー
    • PHP
  • mb_detect_encoding()関数について

    かなり初歩的な質問かもしれませんが、とあるサイトを参考に、以下のスクリプトを作って文字コードをEUC、 改行コードをLFにして保存し、実行しました。 <?php $str="PHP練習"; print mb_detect_encoding($str); ?> これを実行した結果は、 UTF-8でした。 てっきり保存した文字コードが出力されると思ったんですが違いました。ためしに今度は「$str="PHP練習";」の部分を「$str="PHP";」に してみたらASCIIと出力されました。 さらに今度は「mb_detect_encoding($str);」の部分を、 「mb_detect_encoding($str,"UTF-8");」にして実行したら、 UTF-8と出力されました。 「mb_detect_encoding($str,"SJIS");」にして実行したら、 SJISと出力されました。 あといろいろ$strの中の文字を変えたりしてみましたが、 たまに何も出力されないときもありました。 サイトの説明を見たら、「mb_detect_encoding()関数は、文字列のエンコーディング形式を検出します」と書いてありました。 この「文字列のエンコーディング形式」というのは何によって決まるのでしょうか?

    • 締切済み
    • PHP
  • i18n_convert と mb_convert_encoding の違い

    メールの文字化け問題で色々ここも見たのですが ズバリ $enc = mb_detect_encoding($body); $body = mb_convert_encoding($body,"AUTO",$enc); と $enc = mb_detect_encoding($body); $body = i18n_convert($body,"AUTO",$enc); の違いが分かりません。 同じ事をしていると思うのですが・・・。 あと、受信するメーラーや PCが変わると 本文が文字化けしたりしなかったりで "AUTO"の部分をJISにしたらまず文字化けします AUTOなら良かったり良くなかったりです php.iniのこともよく出ていましたが 今レンタルサーバー使っています PHP 4.3.2 を入れているようです 文字コードについてはサーバー管理者に聞かないといけないのでしょうか パリッと文字化けしないようにしたいのですが 何かいい方法はないでしょうか?

    • ベストアンサー
    • PHP
  • mb_convert_encodingとUTF

    mb_convert_encodingでUTF-8>JIS変換行う場合 $fileにファイル内容全部が読み込まれた状態で、mb_convert_encoding($file, "JIS", "UTF-8")とした場合、$fileの冒頭に?という文字化けが残ります。 これを削除もしくは表示させないようにするにはどうしたらよいのでしょうか? if(($buf = mb_convert_encoding(file_get_contents("$file"), "jis","utf-8"))<>""){ $file = tmpfile(); fwrite($file, $buf); rewind($file); if((flock($file,LOCK_EX))!==false){ while(!feof($file)){ $str = fgetcsv($file,1000,","); <処理~~~~> } } fclose($file); }

    • ベストアンサー
    • PHP
  • mb_convert_encodingについて

    Fatal error: Call to undefined function: mb_convert_encoding() in c:\apache\htdocs\test\03-03\common.php on line 27 上記のエラーがでます。 mb_convert_encoding[文字エンコーディングを変換する] を利用するにはphp.iniで設定の変更などありますか?

    • ベストアンサー
    • PHP
  • mb_ereg_replace での文字変換

    PHPでフリーの掲示板を制作中です。 目立たせようとする記号を削除しましたがうまく動きません。 $html = mb_ereg_replace('△', '', 'あああ△あああ'); ・希望結果 ああああああ ・実際の結果 ああ 文字コードは全て EUC-JP です。 また以下を追加するとエラーがでました。 $str="あああ△あああ"; $str = mb_convert_encoding($str, 'EUC-JP', 'auto'); ・エラー Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in そもそもmb_convert_encodingを使わない方が良いのか使い方が悪いのかも解りませんがアドバイスお願いします。

    • ベストアンサー
    • PHP
  • mb_convert_encoding で 一部の文字が変換できない。

    こんにちは、初めて質問させていただきます。 PHPでテキストファイルに保存されたEUC-JPの文字列情報を UTF-8で表示しようとしています。 第一水準、第二水準程度の日本語は問題なく変換ができてるのですが、 「(7)」や「VII」などの特殊な記号文字が変換できないようです。 これは mb_convert_encoding の仕様なのでしょうか? ご存知でしたらご教授お願いいたします。 【ソース】 $buffer = "マル4→(4) ギリシャ4→IV 郵便番号→〒 株式会社→(株) \n"; echo mb_convert_encoding($buffer, "utf-8", "euc-jp"); 【出力結果】 マル4→? ギリシャ4→? 郵便番号→〒 株式会社→? 【環境情報】 Linux (OS、バージョン詳しくは分かりません。) PHP Version 4.3.9 mbstring.detect_order      no value mbstring.encoding_translation  Off mbstring.func_overload      0 mbstring.http_input       pass mbstring.http_output       pass mbstring.internal_encoding    EUC-JP mbstring.language        Japanese mbstring.script_encoding     no value mbstring.substitute_character  no value (Local Value、Master Value 共に同値です。)

    • ベストアンサー
    • PHP

専門家に質問してみよう