文字化けの原因と対策

このQ&Aのポイント
  • PHPで文字化けが発生する原因として、エンコード方式が異なることが挙げられます。
  • 文字化けが発生する場合、文字コードを統一する必要があります。
  • 文字化けを防ぐためには、適切なエンコード技術を使用する必要があります。
回答を見る
  • ベストアンサー

文字化け

PHPを最近勉強し始めたのですが、どうしても文字化けしてしまう箇所があり質問させていただきました。 海外から購入したスクリプトを日本語化しようとしているのですが、エンコード方式が違う?ため、文字化けするようです。(.phpファイルの文字コードはEUC-JPで統一しています) function encode_s($s) { $s = rawurlencode($s); $s = str_replace('%26','&',$s); $s = preg_replace('/%([\dABCDEF]{2})/e', "'&#'.hexdec('\\1').';'",$s); return $s; } マルチバイト関数等を勉強中ですが現状ではわからないです。 どなたかご指摘お願いします。 宜しくお願いします。

  • xyon7
  • お礼率66% (2/3)
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

こんにちは。 えっと、どんな感じで文字化けするんでしょうか。 ご質問に書かれている関数は、文字を数値に変換させてから、10進数に変換してリターンしてますね。(「%26」というのが「&」になります) なぜ、このような処理をしているかわからないので何とも言えませんが、 function encode_s($s){ return $s; } と、encode_s関数定義内の処理をさせないようにするとどうなりますか。

xyon7
質問者

お礼

私情により、返信が遅くなり申し訳御座いません。 上記スクリプトを参考にさせていただき、下記コードにより正常に表示することが出来ました。 function encode_s($str) { $str = htmlspecialchars($str); $str = str_replace('&','&',$str); return $str; } ありがとうございました。

その他の回答 (1)

  • ntm98
  • ベストアンサー率26% (73/273)
回答No.1

海外から購入したスクリプトがHTMLを出力するところまで実装されている場合、<meta>タグで1バイト系の文字セットを定義している可能性がありますが、その点は問題ないでしょうか?

xyon7
質問者

お礼

返信ありがとうございます。 <meta>タグに関してなのですが、charsetは全てのファイルでEUC-JP統一しています。 また、HTML出力ではありません。 説明不足で申し訳ないです。 簡単に申しますと、リンク集のスクリプトなのですが、 フォームへ管理者がリンクを追加(日本語タイトル等) ↓ 管理・許可ページ(文字化けしてしまう) ↓ リンク集へ反映(日本語表示できる) という流れです。 管理ページで全てのリンク名が文字化けしてしまうので困っています。 スクリプト内を調べたところ、エンコード方式で文字化けを起こしていると思い、質問させていただきました。

関連するQ&A

  • str_replaceで文字化け

    お世話になります。 PHPでstr_replaceを使用しましたら、 「ー」や「・」などの文字が、文字化けを してしまいました。 いろいろ調べたのですが、よく分からずに 困っています。 PHPで文字の置換を行いながら、文字化けを しない方法はどのようにしたらよいのでしょうか。 $abc = str_replace(" ", "", $abc); のあとに$abcを出力しましたら、文字化けをして しまいました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • str_replace()で文字化け

    str_replaceについておしえてください。(IE6,php4.3.7,sjis環境) str_replace('','',$str) で$strの中に'能'という文字があると'能\'になってしまいました。 そこで str_replace('能\','能',$str); とすると今度はエラーになりました。 どうすれば化けなくなるでしょうか?

    • ベストアンサー
    • PHP
  • php 指定文字列以降の削除

    phpにて半角スペース以降の文字列を問答無用で削除するというプログラムを作ろうとしてるのですが上手くいきません。 どうすればできますでしょうか? ご教授のほどよろしくお願いいたします。 ---- ソースコード $str = '2017/1/1 10-28'; if (preg_match("/ /", $str)){ $replace = str_replace(' ', '', $str); } echo $replace;

    • ベストアンサー
    • PHP
  • スクリプトの書き方その3

    いつもお世話になります。 XOOPSのコードを読んでいるんですが、沢山の方が関与しているので、 スクリプトの書き方もまちまちです。 そのせいで、素人の私は完全に混乱状態になっています。 ※ PHPマニュアルのサイトでは、preg_xxxっていうのは、 /$str/ とういうように、/(スラッシュ)を使っているので、 !, %, | ? が出てくると、何が正しい書き方なのか全くわかりません。 質問 (1) preg_replace("[\r\n]", "", $str) と preg_replace("/[\r\n]/", "", $str) は同じですか? 質問 (2) preg_replace('!<[^>]*?>!', ' ', $string) と、 preg_replace('/<[^>]*?>/', ' ', $string) は同じですか? 質問 (3) (preg_match('!\W(\w+)$!s', $search, $match) と (preg_match('/\W(\w+)$/s', $search, $match) は同じですか? 質問 (4) preg_replace('?/\*.+\*/?sU', '', $val) の ?とはどういう意味ですか? preg_replace('/\*.+\*/sU', '', $val) と同じですか? それとも、 preg_replace('/?/\*.+\*/?/sU', '', $val) と同じですか? 質問 (5) preg_replace("%(?<!\\\\)'%", "\\'", $string) の、%とはどういう意味ですか? preg_replace("/(?<!\\\\)'/", "\\'", $string) と同じですか? それとも、 preg_replace("/%(?<!\\\\)'%/", "\\'", $string) と同じですか? 迷惑かけますが、どうか、教えて下さい。 よろしくお願いします。

    • 締切済み
    • PHP
  • JSでURIエンコードしてPHPでデコードしたい

    foo.htmlから読み出されたbar.js内で、リファラーをURIエンコードし、baz.phpでデコードするようにしました。 コードは以下です。 ■foo.html <script type="text/javascript" src="bar.js"></script> ■bar.js //PHPのrawurlencode互換のURIエンコード関数(らしいです) function rawurlencode(str) { return encodeURIComponent(str) .replace(/!/g, "%21") .replace(/'/g, "%27") .replace(/\(/g, "%28") .replace(/\)/g, "%29") .replace(/\*/g, "%2A") .replace(/~/g, "%7E"); }; ref = rawurlencode(document.referrer); document.write('<img src="/bar.php?ref=' +ref); ■baz.php rawurldecode($_GET["ref"]); これでfoo.htmlがUTF8であった場合は正常にリファラが取得できました。(日本語も含め) しかし、foo.htmlがShift-JISであった場合、リファラ内の日本語部分が文字化けしてしまいます。 色々と試行錯誤してはみたのですが、どうしても解消されません。 どなたかお力をお貸しください。 よろしくお願いいたします。

  • preg_replaceにおけるeオプション

    文字列$strは、「aa:bb」という文字列を含み、$flagが1のときは、この部分を「aa」に。0のときは「bb」に置き換えるという処理で、 $str = preg_replace("/(.*):(.*)/e","($flag) ? $1 : $2", $str); とするも、うまくできません。 http://www.jp.u4ia.net/~tkyng/php/php_manual_i18n/function.preg-replace.html こちらのサイトの一番下にe修飾の使い方がのっているのですが、これを真似てもうまくいきません。 e修飾の使い方を教えてください。

    • ベストアンサー
    • PHP
  • PHPの文字化けについて(2)

    いつもお世話になってます。 以前、以下の質問をさせて頂いた者です。 http://okwave.jp/qa/q7743818.html 以前とは異なった形で再度文字化けの問題が発生しており、 何か解決するための情報がありましたらご提供頂けませんでしょうか。 ------------------------- PHPで、テキストボックスと登録ボタンを配置した簡単な入力フォームを作成しました。 そこでテキストボックスに「章」と言う文字を入力し登録をすると、 DB側には「・ス・ス」と文字化けがなされて登録されます。 しかしながら上記の内容は、教授のPCでしか発生せず、 私のPCでは発生しない問題であるため原因の特定が難しく困っております。 PC自体は同じモノを使用しているため、 使っているブラウザの違いから本問題が発生しているのでは?と考えました。 教授はChrome(最新版)、私はIE又はFF(最新版)を使用しています。 ところが試に自PCへChrome(最新版)を入れ確認をしてみた所、 無事「章」という文字が登録されたため、未だに私の環境では発生しません。 次にPHPのソースに問題があるのではないかと考えました。 入力された文字列は1つの事を除き、そのままDBへ登録しています。 やっていることは、「前後にスペースが入っていれば取り除く」と言う事です。 以下、ソースになります。 ---- function alltrim($str){ $str = preg_replace('/^[[:space:]]+/', "", $str); $str = preg_replace('/[[:space:]]+$/', "", $str); return $str; } ---- 何かおかしな点等ありますでしょうか? 他に調べたほうがよい事柄がありましたら 情報のご提供宜しくお願い致します。

    • 締切済み
    • PHP
  • PHPの正規表現で【】内を文字列ごと削除

    あいうえお【かきく】けこさ。【しすせそ】 といった感じの文字列を、【かきく】や【しすせそ】を削除して、 ”あいうえお けこさ。” としたいのですが・・・ $str = preg_replace("【.*】"," ",$str) とすると、 あいうえお ってなっちゃうし、 $str = preg_replace("/【.{1,5}?】/"," ",$str) とかやってみても上手く行かず。 はて?「/」は何を意味するのだろう。とか思いながら試行錯誤してはみてるのですが・・・ どなたかご教授くださいませんでしょうか。 お願いします。

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

    現在、PHP(EUC-JP)でプログラムを作成し、テンプレートはS-JISで表示しています。 テンプレートには下記のようにリンク先をはっています。 <a href="REPLACE">NAME</a> REPLACEとNAMEはPHP側で作成した値を置き換えています。 NAMEはmb_convert_encodingでEUC-JPをS-JISに変更していますが、リンク先には日本語の文字が含まれています。 私が、考えたものは次に遷移したいPHP以下をエンコードし、それをmb_convert_encodingするというものです。 $url="test.php?ID=".$stData[$i]['id'].&gStationName=".$stData[$i]['name']; $url_encode=urlencode($url); $all_data['test'] = mb_convert_encoding($url_encode, "SJIS", "EUC-JP"); このリンク先にカーソルをあてると、日本語はアラビア文字みたいなのが、表示されます。 しかし、このリンクをクリックすると、エンコードされたURLが表示されます。 なぜ、このような現象が起こるのでしょうか? ご教授ください。

    • ベストアンサー
    • PHP
  • base64encodeでの文字化けについて

    先日、PHPとjavascriptのエンコードについて質問をしました。 http://okwave.jp/qa/q8512040.html その後いろいろと試してみたところ、javascript上で 日本語の文字列に対してbase64_encodeをして、 base64_decodeをすると文字化けが起こりました。 ソースは以下の通りです。 <html> <head> <title>サンプル</title> <script type="text/JavaScript" src="base64.js"></script> </head> <body> <script type="text/javascript"> <!-- str="abcde12345あいうえお"; encode_str=base64encode(str); decode_str=base64decode(encode_str); document.write("元の文字列:"+str+"<br>変換後の文字列:"+decode_str); // --> </script> </body> </html> base64.jsは以下のサイトのものを使用しています。 http://www.onicos.com/staff/iz/amuse/javascript/expert/ 結果は以下の通りです。 元の文字列:abcde12345あいうえお 変換後の文字列:abcde12345BDFHJ 文字コードはUTF-8を使用しているのですが、他の文字コードで 試してみても文字化けします。 原因や対処方法がおわかりの方がいらっしゃれば、教えて下さい。 よろしくお願いします。