- ベストアンサー
PHPでの文字コードについて
- 【文字コードについて】PHPで日本語の文字化けが発生し、mb_convert_encoding()関数を使用して解決しようとしていますがうまくいきません。他の方法やアドバイスを求めています。
- 【日本語文字化けの解決方法】PHPでの文字化けが発生し、mb_convert_encoding()関数を使用してUTF-8に変換しようとしていますが、うまくいきません。他の解決方法やアドバイスを求めています。
- 【PHP文字化け解決のアドバイス】PHPで日本語の文字化けが発生し、mb_convert_encoding()関数を使用してUTF-8に変換しようとしていますが、うまくいきません。どなたか他の解決方法やアドバイスをいただけませんか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
前置きが長くなりますが、 複数回t_ohta様のほうで回答いただいている内容に対して、横やりをいれた理由は、「曲の中にある特定の言葉を含む」という文言と、「カラオケ曲の文字コードがわからない」という文言から、ファイルの中に歌詞があり、その歌詞の文字コードがわからない、という質問として誤読されている可能性があると思ったからです。 つきまして、 「PHPで読み込んだデータをバイナリー形式に変換して確認する」 「php.iniでPHPが扱う基本の文字コード」 を設定することにより解決するのは、テキストファイル内の文字列データに対してのことと思います。 今回の件は、Windowsのファイル名が文字化けすることが根本原因と思います。 そして、Windowsの日本語は、基本的にShift-JISで表現されています。 さらに、PHP5では、先の回答に添付させていただきました参考サイトにも記載の通り、5C問題という根深い問題を解決できずにいました。 ただし、「Windowsの日本語は、基本的にShift-JISで表現されています」と上に記載しましたが、それをUTF-8として表現することも可能となっているようです。 Windows10 – システムロケールをUnicode UTF-8に変更する方法・言語設定 https://howpon.com/247 上記のサイトをご確認いただくと、ベータ版の機能として提供されているUTF-8にする方法があります。 メニューの流れが若干差異があるかもしれませんが、近しい場所を探して設定していただくことで問題が解決できる「可能性があります」。 ここで予防線を張るのは私自身が実際に検証したわけではないので、本当に治るかはわからないからです。 ※ 副作用も大きいように感じていますので(古いアプリが軒並み使えなくなる、とか)試してみるのに躊躇しました。 また、もう少し安全なアプローチとしては、やはりXAMPPのバージョンを最新にすることです。 この手のOSとの互換性の問題は、PHPのバージョンアップなどのバグ修正・昨日修正以外で正しく治ることはないですので、むしろ「日本語ベースのMySQLのデータベースの文字化け」を治すほうが容易であると考えました。 つきまして、安全なアプローチを考えるのであれば、一旦この質問は閉じていただき、MySQLの移行について文字化けする件についてを再度質問しなおしていただいてはいかがでしょうか。 その際に、 ・MySQLのバージョン(マイナーバージョンまで記載のこと) ・日本語ベースのMySQLのデータベースというのが、CREATE DATABASE、CREATE TABLEしたときにどの文字コードを指定したか など、細かい情報をあらかじめ調べておいていただくことが肝要です。 以上長くなってしまいましたが、よろしくお願いいたします。
その他の回答 (4)
- hogehoge78
- ベストアンサー率80% (433/539)
PHP7.1以降、Windows10で実行した場合、日本語名のフォルダやファイルは、PHPのスクリプトをUTF-8とした場合、UTF-8として、扱うことが可能なようです。 つきまして、以下の二点、ご確認いただけますか。 ①文字列描画前(echoやprint)前にヘッダを出力する。 一旦、プログラムの先頭でよいので、 header('Content-Type: text/html; charset=UTF-8'); を追加してみてください。 ②文字コード変換処理を削除する。 前述したとおり、Windows10のファイルシステムがShift-JISであるものの、UTF-8で記述したPHPではUTF-8として扱うようですので、変換処理を実施しないようにしてみてください。 尚、PHPスクリプトをShift-JISで書いている場合においてはどのようになるかは確認していないので、その場合、まず文字コードをUTF-8にして保存しなおしてみてください。 参考文献:https://spelunker2.wordpress.com/2016/07/25/php7-1%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E5%95%8F%E9%A1%8C5c%E5%95%8F%E9%A1%8C%E3%81%8C%E8%A7%A3%E6%B1%BA%E3%81%B8/
お礼
回答有難うございます。 ヘッダーを入れてみましたが結果は同じでした。 また、私はだいぶ前のXAMPPを使っているために、PHPはバージョン5です。 以前一度だけ新しいXAMPPを入れて、PHPのバージョン7にしたことがあったのですが、 それまでに作ってあった日本語ベースのMySQLのデータベースが文字化けしてしまって、 その問題をどうしても解決できなかったのでたので、再度古いXAMPPに差し替えた経緯があります。 また私はカナダに住んでいて、こちらで購入したWindows10のPCに日本語言語パックを入れただけなので、 自分のPCの文字コードが現在Shift-JISになっているのかもわかりません。 従って文字変換処理を削除するのに効果があるかわかりませんが、これもやってみました。 しかし変化はありません。 今回は私が前に質問させていただいた2件についてはご回答いただけませんでしたが、 よろしければそちらの方も回答いただけると有難いです。 「PHPで読み込んだデータをバイナリー形式に変換して確認する」件と 「php.ini でPHPが扱う基本の文字コード」の件です。 どうかよろしくお願いいたします。
- t_ohta
- ベストアンサー率38% (5238/13705)
> 問題にしているカラオケ情報の文字列の元の文字コードというのはどのように調べればわかるのですか? 一番いいのは、PHPで読み込んだデータをバイナリー形式に変換して確認することでしょうね。 > また「内部文字エンコーディング」というのはブラウザーで使われているコードという意味でしょうか? ブラウザでは無くPHPの内部で使われている文字コードです。 php.ini でPHPが扱う基本の文字コードを指定しています。 複数の文字コードが混ざると正しく処理できなくなるので、PHP内部で扱う文字コードを統一し、基本的にはその文字コードで内部処理を行おうとします。 Cookieやフォームから投稿された文字などはPHPの設定次第で、勝手に内部文字エンコーディングで指定された文字コードに変換したりします。
お礼
回答有難うございます。 お礼が遅くなったことをお詫びいたします。 回答の内容が私には難しい感じなので、さらに質問させてください。 >PHPで読み込んだデータをバイナリー形式に変換して確認する これは具体的にはどうすればよいのでしょうか?何かの関数を使うのでしょうか? また変換後のバイナリーデータから文字のコード形式はどのように識別するのでしょうか? >php.ini でPHPが扱う基本の文字コード "C:\xampp\php\php.ini-dist" と "C:\xampp\php\php.ini-recommended" という二つのファイルをnotepad で開いて見てみましたが、文字コードに関する記述はどこにも見当たりませんでした。 回答者さんの仰るphp.iniというのはどこを探せばあるのでしょうか? 以上につき、お答えを頂けると有難いです。
- t_ohta
- ベストアンサー率38% (5238/13705)
> 私のmb_convert_encoding( ) の使い方に問題はないでしょうか? > 何か他にヒントがあれば教えてください。 mb_convert_encoding() 自体の使い方は問題ありませんが、元の文字コードを指定しない場合が内部文字エンコーディングが初期値として与えられます。 php.ini で設定している文字コードがOSの文字コードと一致しない場合は文字化けする可能性があります。 第3引数に「"JIS, sjis-win, eucjp-win"」のように可能性のある文字コードをカンマ区切りで入れておくか「"auto"」で自動判別に賭ける方がいいと思います。 また、文字コードによっては文字数が少ないと自動判別に失敗して違う文字コードと認識して文字化けする場合があるので、できれば文字コードを予め調べた上で決め打ちで指定する方がいいです。
お礼
回答有難うございます。 今まで文字コードというものを意識したことが無かったので、こういう問題には全く疎いです。 問題にしているカラオケ情報の文字列の元の文字コードというのはどのように調べればわかるのですか? また「内部文字エンコーディング」というのはブラウザーで使われているコードという意味でしょうか? そうだとすると、それがどのコーディングなのかとか、「OSの文字コード」とかもどうやればわかるのでしょうか? もしご面倒でなければ教えてください。 お願いします。
- t_ohta
- ベストアンサー率38% (5238/13705)
ブラウザはちゃんと、そのページの文字コードがUTF-8だと認識していますか。 HTMLヘッダで文字コードを指定しないと、SHIFT-JISとして表示しようとしている場合があります。
お礼
早速にご回答を頂き、有難うございます。 ヘッダーに以下のようなメタタグを入れてみましたが、結果は同じでした。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 私のmb_convert_encoding( ) の使い方に問題はないでしょうか? 何か他にヒントがあれば教えてください。
お礼
ご回答ありがとうございます。 まず告白しなくてはならないことは、実は初めにご回答を頂いたt_ohtaさんと、 前回および今回ご回答いただいたhogehoge78さんとのお二人が回答して頂いていることを、 今まで認識せずにいたことです。 回答者様のユーザーネームさえ確認しないで回答を読み、 誰に対して質問しているのかさえ意識せずに好き勝手なことを聞いていた自分が恥ずかしくなります。 この件どうかお許しください。 さて私の質問ですが、hogehoge78さんのご認識の通り、aaa-karaoke/japanese というフォルダーに 300曲近い日本語のカラオケの動画が格納されています。 したがってこのフォルダーを開けるとそのカラオケ動画のファイル名として、「番号、曲名と歌手の名前」からなる文字列が表示されます。が表示されます。 私の最初の質問に添付してある画像の左半分にあるのがその一部です。 私が今作りたいプログラムは、このファイル名の中に、例えば「恋」という字が入っているものがあれば別のフォルダーにコピーしようとすることです。 例えば「五輪真弓 恋人よ」とか「大滝詠一 恋する二人」などが該当します。 そしてreaddir()関数を使ってファイル名を一つずつ読み込み、表示させ、strpos()関数で「恋」の字があるかを調べて、あったら別のファイルに動画ファイルをコピーしようという訳です。 この表示させるという段階で文字化けが起こっています。 今回hogehoge78さんからご提案頂いたことをよく考えて、XAMPPの新しいものを入れてみようと思います。 いつかはそうしようとずっと考えていたのですから。 そこで、この質問はここでいったん閉めさせていただき、PHP7の入ったあたらしいXAMPPで同じことをやってみたいと思います。 それでもまだ同じ文字化け問題が発生するようであれば、別の問題として質問させていただきます。 どうも有難うございました。