PHPの文字コード変換で文字化けが発生する問題について

このQ&Aのポイント
  • PHPのmb_convert_encoding関数を使用して、utf-8からsjisに文字コードを変換する際に、一部の文字が文字化けしてしまう問題が発生しています。
  • 設定ファイルをsjisで作成し、PHPで読み込んで内容を更新した後、再度設定ファイルとして書き出すスクリプトを作成していますが、変換処理を行うと文字化けが発生します。
  • 具体的な事例として、変換前の文字列「book_style="文庫,新書,雑誌,ムック,ソフトカバー,ソフトカバー大型本,ハードカバー,ハードカバー大型本,絵本"」が変換後に「book_style="文庫,新書,雑誌,ムック,ャtトカバー,ャtトカバー大型本,ハードカバー,ハードカバー大型本,絵本"」となる状況が報告されています。
回答を見る
  • ベストアンサー

PHP mb_convert_encoding sjisからutf-8

PHP mb_convert_encoding sjisからutf-8で一部文字の文字化けが発生します。 設定ファイル(sjisで作成)をPHP(utf-8)で読み込み、内容を更新して、再度設定ファイルとして書き出す(上書きする)スクリプトを書いています。utf-8で書き出す分には、全く問題がないのですが、書き出す前にmb_convert_encodingでutf-8からsjisに変換すると、文字化けする字が発生します。具体的には、以下の通りです。 事例1 ・変換前(utf-8) book_style="文庫,新書,雑誌,ムック,ソフトカバー,ソフトカバー大型本,ハードカバー,ハードカバー大型本,絵本" ・変換後(sjis) book_style="文庫,新書,雑誌,ムック,ャtトカバー,ャtトカバー大型本,ハードカバー,ハードカバー大型本,絵本" 事例2 ・変換前(utf-8) ;詳細侮ヲの最大表示件数 ・変換後(sjis) ;詳細侮ヲの最大侮ヲ件数 該当するプログラム文は、以下の通りです。 $filepath = "setting.ini"; $string = $total_gyo;//ここで出力内容を代入します $string = mb_convert_encoding($string, "sjis-win", "utf-8"); $string = stripslashes($string); $fp = fopen($filepath, "w"); @fwrite( $fp, $string, strlen($string) ); fclose($fp); 各行分割して代入しても、全行一括で代入文字化けの発生状況は同じでした。 以上、どうぞよろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数10

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ソは5C問題の代表的存在ですね。 すでに指摘があるとおりstripslashesの使い方を考え直す必要があるでしょう。

terayamada
質問者

お礼

なるほど、入力する文中に””などがあり、その処理でバックスラッシュが 発生するため、入力前に削除するため、stripslashesを挿入していました。 ご指摘のように、使い方を工夫したいたいと思います。 ありがとうございます。

その他の回答 (1)

回答No.1

>$string = stripslashes($string); この一行は何のために入っているの?

terayamada
質問者

お礼

#2の方へのお礼でも書きましたが、出力する文章内に""などが入る事があり、その処理でバックスラッシュが入る事があるため、その処理で入れていました。 ご返答ありがとうございます。

関連するQ&A

  • phpのmb_convert_encodingで文字化け

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

    • ベストアンサー
    • 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
  • SJIS->UTF8->SJISコード変換について

    Windows XPでVB.NET2010で文字コード変換のプログラムを下記のように作成しました。 Dim beforeStr As String = "変換前" Dim utfEnc = System.Text.Encoding.GetEncoding(65001) Dim sjisEnc = System.Text.Encoding.GetEncoding(932) Dim beforeBytes() As Byte = utfEnc.GetBytes(beforeStr) Dim afterBytes() As Byte = System.Text.Encoding.Convert(sjisEnc, utfEnc, beforeBytes) Dim afterStr As String = sjisEnc.GetString(afterBytes) TextBox3.Text = afterStr Dim reverseStr As String = afterStr Dim reverseBytes() As Byte = sjisEnc.GetBytes(reverseStr) Dim baseBytes() As Byte = System.Text.Encoding.Convert(utfEnc, sjisEnc, reverseBytes) TextBox4.Text = utfEnc.GetString(baseBytes) SJIS->UTF8に変換して、確認のためにUTF8->SJISに逆変換してみましたが、 「変換」までは正しいのですが、最後の「前」が文字化けしてしまします。 正しくSJIS-.UTF8->SJISするには、どのように修正すればよろしいでしょうか? よろしくお願いします。

  • mb_convert_encodingの文字数

    質問させていただきます。 半角256文字以上の文章を以下のように表示させようとしています。 mb_convert_encoding($str,"UTF-8","SJIS") これで文字列を表示させようとすると文字が256文字で途切れてしまいます。 文字列を256文字以上で、文字数制限なく、表示させる方法を 探しています。どなたかわかる方いたら教えてください。

    • ベストアンサー
    • PHP
  • 【PHP】mb_convert_encoding()で "~" 等が化ける

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

    • ベストアンサー
    • 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
  • SJIS→UTF-8変換後の文字化けについて

    EXCELで作ったテキストデータ(SJIS)をPHPで読み込んでUTF-8でDBへ書き込むという処理をしたいのですが、一部どうしても文字化けしてしまう文字("l(リットル)"と"II")があり困っています。 具体的には、data.dat(SJIS)を、 hoge.php(UTF-8)で、 $data = mb_convert_encoding(file_get_contents("data.dat"),"UTF-8","auto"); というようにしています。 テキストデータはSJIS、DBへはUTF-8というのは変えられません。 なにかよい方法はないでしょうか?

    • ベストアンサー
    • PHP
  • PHPのSJISからUTF-8への変換で文字化け

    いつもお世話になります。 PC用システムがあり、一部データを携帯電話からも更新したいと思い、既に稼働しているUTF-8のシステムに機能追加しています。 携帯はSJISのみとの事ですので、SJISで携帯用サイトを作成し、DBからデータの読込、表示など問題なくできるようになりました。 携帯サイトでHTMLフォームを作成しており、そこからDBへ書き込む際に、判る範囲ですが以下の文字が文字化けして登録されてしまいます。。 予→浴 ソ→メ 他にも文字化けしそうな感じなのですが、なぜ上記の特定文字だけ文字化けするのでしょうか・・・? 例えば 大阪 東京 名古屋 アップル などは一切文字化けせず問題ありません。 PHP自体はSJISで作成しており、DB登録時にmb_convert_encoding($txt,"UTF-8","SJIS")でUTF-8としています。 どなたかお詳しい方、ご教授のほど宜しくお願い致します<(_ _)>

    • ベストアンサー
    • PHP
  • UTF8のPHPにSJISのPHPを組みこむ方法?

    charset=UTF-8で動作するPHPファイルがあります。 ****************** UTF-8で動作するPHP ****************** <?php ・・・・・・・・ header("Content-type:text/html;charset=UTF-8"); ?> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; UTF-8"> <title><?=$API_NAME?></title> </head> ・・・・・・・・・・ ・・・・・・・・・・ </html> のような形です。 一方、SJISで動作する下記のPHPがあります。 このS_JIS PHPを上記のUTF-8PHPの中の</head>と</html>の間に組み込みたいと思います。 下記のPHPは、data.csvからファイルの中身を表示させるPHPですが、そのまま放り込むと 文字化けしてしまいます。 (下記のPHP単体だと正しく表示されます。charset=UTF-8下で文字化けします) data.csvの文字コードをUTF-8にする。LF にするなど試してみましたが文字化けしたままでした。 また、#include <string.h>の下に mb_convert_encoding($string, 'utf8', 'sjis'); を入れてみましたが文字化けは直りませんでした。 お手数ですが下記のPHPをUTF8上で正しく表示させる方法が分かりましたらご教授願います。 ****************** SJISで動作するPHP ****************** <? #include <string.h> // CSV ファイルを読み込み、$data配列に格納 $handle = fopen("data.csv", "r"); while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) { if ( strcmp( $row[0] , '110' ) == 0 ) { $data[] = array( 'shop'=>$row[0] ,'priceA'=>$row[1], 'priceB'=>$row[2], 'place'=>$row[3] ); } } fclose($handle); // 列方向の配列を得る foreach ($data as $key => $row) { $shop[$key] = $row['shop']; $priceA[$key] = $row['priceA']; $priceB[$key] = $row['priceB']; $place[$key] = $row['place']; } // 結果の表示 for( $i=0 ; $i<count( $data ) ; $i++ ) { print "$shop[$i] $priceA[$i] $priceB[$i] $place[$i]<br>\n"; } ?>

    • ベストアンサー
    • 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

専門家に質問してみよう