PHP文字コードの不思議!?

このQ&Aのポイント
  • さくらインターネットでは問題なかったものがヘテムルに移行すると起こる現象について、PHPにてcsvファイルを読み込んで表示すると日本語が表示されない問題が発生します。
  • csvファイルを読み込むと、欧文の場合は正常に表示されるが、日本語が含まれる場合は表示されない現象が発生しています。
  • さくらでは起こらなかった現象であり、php.iniなどの設定にも特に問題はないため、対処方法を求めています。
回答を見る
  • ベストアンサー

PHP文字コードの不思議!?

PHP文字コードの不思議!? さくらインターネットでは問題なかったものがヘテムルに移行すると起こりました。 PHPにてcsvを読み込んで表示しています。 [ csv ] 01,りんご 02,orange 03,orangeりんご 04,りんごorange というよな、csvファイルを読むと・・・ 01 りんご→何も表示されない 02 orange→orange 03 orangeりんご→orangeりんご 04 りんごorange→orange 化けることはないですが日本語が表示されず、 しかし冒頭が欧文の場合、続きの日本語は表示されます。 (日本語をあなどとすると正常に表示します) csv、php、共にUTF-8で作成しています。 さくらでは起こらなかった現象ですが・・・ php.iniなど特にさわっておりません。 どう対処すればよいでしょうか???

  • tkmkok
  • お礼率87% (128/146)
  • PHP
  • 回答数3
  • ありがとう数20

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

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

fgetcsv関数は、ローケルを考慮するので、 setlocale(LC_ALL, 'ja_JP'); としてローケルを日本語に合わせたのだと思いますが、文字コードも合わせる必要があるのではないでしょうか。(サーバの内部コードがEUCとかになってそう) setlocale(LC_ALL, 'ja_JP.UTF-8'); ちなみにfgetcsv関数は、単純にCSVの一行を配列にして読み込むというだけではなく、 Excelなどが吐き出すようなCSV、 例) 1,2,"test,asdfada",aaaa,"aaaa bbbb" このようなものを、 array( 0 => 1, 1 => 2, 2 => "test,asdfada", 3 => "aaaa", 4 => "aaaa\nbbbb", ) というように読みだします。 そのため文字コードなど考慮する必要があり、ローけるの設定や文字コードの設定が重要になります。 explode関数に関しましては、単純に、第一引数で指定された区切り文字で文字列を区切って配列にするものになります。 なので、文字コードを考慮せず単純に切るだけだから文字化けも発生しません。 今回の質問者さんの作成されているCSVデータは、上記の例のような、複雑なものではないのであれば fgets関数で一行読み出して、その一行をexplode関数でカンマで区切ってやればよいのではないでしょうか。

その他の回答 (2)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

既に対処しているようですが、原因を潰しておかないと他の部位にも影響が あるかもしれません。 >> さくらインターネットでは問題なかったものがヘテムルに移行すると起こりました。 >> -<中略>- >> php.iniなど特にさわっておりません。 >> どう対処すればよいでしょうか??? ソースもphp.iniも変更していないのなら、サーバー側の違いとなります。 今回の現象は、サーバーOS上のロケール設定の違いの可能性が高いです。 ロケールが原因ならsetlocale関数でさくらと同じロケールに設定するだけです。

tkmkok
質問者

お礼

最初に試したのがそのsetlocale関数でした。 setlocale(LC_ALL, 'ja_JP'); としたところ日本語は表示されましたが、一部が文字化けしました。 "さくらと同じに"とのことですが、 どのようにして調べればよいのでしょうか?? setlocaleについて教えていただければ幸いです。。

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

>PHPにてcsvを読み込んで表示 どうやって読みこんでるか書かないと解決策も何も・・・ まずはphpinfoでmbstringの状況を確認した方がいいですね あとはサーバー側にiconvの設定を確認するとか

tkmkok
質問者

お礼

おっしゃるとおりです。 コードが無いと分からないですよね。 http://www.phppro.jp/qa/371 上記URLでなんとか自己解決できました! 以下引用 >fgetcsv はバイナリセーフとなっていますが、 >日本語を含む CSV のパースは自分で行ったほうが無難です。 >$csvdata = fgetcsv($csvfile, 1000); >を >$csvdata = explode(',', trim(fgets($csvfile, 1000))); >に置き換えてみてください。 fgetcsv ではなく explode で処理するとすんなりいけました。 これはどういう違いがあるのでしょう。 何故 explode だとうまくいくのか???

関連するQ&A

  • PHPとMYSQLの文字コードについておねがいします。

    Apache2、PHP5、MYSQL5.0を使用しています。 当方、PHPの初心者講座などを見てUTF-8で作っていこうと思い設定をしたものの、上手くいかず質問させていただきました。 PHPからQuery文(日本語)を送ってMYSQLのテーブルにINSERTしたのですが、文字化けしてしまいます。 my.iniのdefault-character-set=部分をutf8からsjisやujisなどに変えてやってみたのですが、文字化けの種類(?)が変ってしまうだけでやはり文字化けしてしまいました。 ALTER DATABASE AAA CHARCTER SET utf8をやっても変らず文字化けしてしまい、show variables like 'char%'でCharcterを調べたところ、下記のようになっていました。 charcter_set_client | utf8 charcter_set_connection| utf8 charcter_set_database | utf8 charcter_set_filesystem| binary charcter_set_results | utf8 charcter_set_server | utf8 charcter_set_system | utf8 MYSQLとPHPの文字に関係あるようなところをコピーしました。 どこかおかしなところがあるでしょうか。 ------my.ini----- [mysql] default-character-set=utf8 [mysqld] default-character-set=utf8 ----------------- ------php.ini----- output_buffering = Off extension=php_mbstring.dll [mbstring] mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.http_output = UTF-8 mbstring.encoding_translation = On ------------------ どなたか解決策を知らないでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • PHP4の文字コード

    PHP4.3系を使っています。 ソースは絶対にEUC-JPでないと日本語文字で困る場合があると聞いたことがあるのですがそれは正しいでしょうか? できれば、UTF-8を使いたいです。 たまにウェブでSJISソースを見かけますが問題ないのでしょうか?

    • ベストアンサー
    • PHP
  • PHPファイルないでの文字コードについて

    PHPファイルの頭の部分で、あるDBからとってきた情報を配列に入れています。 この中身に日本語も含まれています。とりあえず$aとし、その中にはuser_idというのが 入ってるとします。 冒頭のPHPの中で echo $a[0]['user_id']; exit; とすると、ページ上で正しく表示されるのですが、このexitを消すと文字化けしてしまいます。 htmlの方でも、以下のように文字コードをutf-8と指定してみたのですがダメでした。 <?php echo "<?xml version='1.0' encoading='utf-8'?>";?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> 解決策をご存知の方がいらっしゃいましたらご教授お願いいたします。

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

    PHP4.3.2 Windows2000 PostgreSQL RedHat Linux DBから取得した値をCSVファイルに書き出します。 この時に日本語が文字化けをしてしまうのです。 php.iniの設定を変えれば、良いのでしょうか? 初歩的な質問で申し訳ありませんが、 よろしくお願いします。 php.iniの設定内容 default_charset = "SJIS" mbstring.language = Japanese mbstring.internal_encoding = eucJP-win mbstring.http_input = ASCII,JIS,Windows-31J,UTF-8,EUC-JP mbstring.http_output = Windows-31J mbstring.detect_order = ASCII,JIS,Windows-31J,UTF-8,EUC-JP mbstring.substitute_character = none DBの設定内容 List of databases Name | Owner | Encoding -----------+----------+---------- test | postgres | EUC_JP

    • ベストアンサー
    • PHP
  • UTF-8だと文字化けしてします。

    UTF-8だと文字化けしてします。 phpを利用しています。 UTF-8でphp.iniを設定したのですがphpを表示させると文字化けしてしまいます。 エンコードで日本語選択をすると普通に表記されるのですが・・・。 HTMLだと問題はありません。 これをUTF-8の状態で表示させることは出来ますでしょうか? 初心者ゆえ、ご教授願えれば幸いです。 下記サイトになります。 http://irisdesign.main.jp/office/

  • 1サイト中に異なる文字コードの混在

    Linuxで、文字コードutf8でPHPを使ってサイトを構築していました。/etc/php.ini では文字コードやmb関数のコードとしてutf8を指定しています。 ここで、あるディレクトリ配下だけ、文字コードEUC-JPを使ってPHPで書かれたページ群(具体的にはpukiwiki)を配置したいのですが、そのようなことは可能でしょうか? 設定を変えずにpukiwikiを動かすと、表示や日本語入力は大丈夫でしたが、名前が日本語のページが作れませんでした(不正な名前と言うようなエラー)。おそらくmb関数が原因かなと想像。 2個のapacheを上げるというのは無しで。 レンタルサーバーではないので、設定ファイルは自由にいじれる環境です。

    • 締切済み
    • PHP
  • PHPの文字コードについて

    Wordpressで作成してWebページを作成しているPHP初心者です。 WordpressでUTF-8ボム無と指定されているので、全てUTF-8ボム無で揃えています。 PHPで出力される文字列は問題ないのですが、PHP内に日本語を埋め込んで 出力しようとすると下記の「更新日」の部分がXYなどと文字化けします。 ブラウザ上でShift-jisに変更すると「更新日」はきちんと表示されますが、 他の出力される文字列が化けてしまいます。 どこかで文字列の指定をしなければならないのでしょうが、まったくわかりません。 (FTP上でサーバーファイルを見た文字列は化けていません。 ブラウザに表示される段階で文字化けします。) どこをどのように変更、または追加したら良いのでしょうか。 <article <?php post_class(); ?>> <header class="entry-header"> <time pubdate="pubdate" datetime="<?php the_time('Y-m-d'); ?>" class="entry-date"> <?php echo'更新日:' ?><?php the_time(get_option('date_format')); ?></time> <h1 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1> </header> <section class="entry-content"> <?php the_content(); ?> </section> </article> 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHP国際化の文字コード

    PHP国際化の文字コード 初心者です。 PHPで実装されている既存のWebサイトの国際化を行う予定です。文字コードはEUC-JPです。 文字コードをEUC-JPのまま、ブラウザの言語設定等によって英語でも表示するよう改修を行う場合、海外のPCで日本語を表示したい人、または英語を表示したい人は正しく表示できるのでしょうか?あるいはUTF-8への全面変更等を考慮しないといけないのでしょうか? 知識不足で恐縮ですが、ご教授願います。

    • ベストアンサー
    • PHP
  • PHP4からPHP5にしたときのDB文字化けについて

    よろしくお願い致します。 すでに、PHP4で作っていたサイトで、DBにもいろいろと登録していたのですが、PHP5にしたい事情が出てしまい、PHP5にしました。 すると、すでに登録されていた、DBの内容が文字化けしてしまいました。 PHP4(UTF8)+MySQL5(UTF8) → PHP5(UTF8)+MySQL5(UTF8) 情報足りませんでしたら申し訳ないです、申し付けて下さい。 phpMyAdminから見たときは、すでに入っていたDBの内容は文字化けはしていないのですが… 次にPHP5で新しく登録した場合は、サイトでの表示は文字化けしないのですが、次はphpMyAdminで見ると文字化けしていました。 php.iniの設定も同じにしてます、Apacheのconf設定なども見たのですが、文字化けは解消しませんでした。 よろしくお願い致します。

    • 締切済み
    • PHP
  • UTF8のPHPコードから日本語をINSERTするとphpMyAdmin上で文字化けしてしまう

    ・WindowsXP(SP2)IIS5.1 ・PHP 5.2.5 Win32 ・MySQL 5.1.22 RC Win32 ・phpMyAdmin 2.11.4 多言語(日本語と中国語)を扱える簡単なシステムを試作しているのですが、 test1.php(UFT8-BOM無し)からINSERTしたレコードをphpMyAdminから閲覧 すると日本語が「&egrave;&sup2;&iexcl;&aring;›&pound;&aelig;&sup3;•&auml;&ordm;&ordm;&aelig;」などと文字化けしまくっています。 test2.phpからSELECTすると、まったく文字化けなく呼び出せます。 また、phpMyAdminから直接INSERTしたレコードば文字化けしません。 当初、MySQL4.1.22-win32や、phpMyAdmin 2.8.2.4だったので、 冒頭の最新バージョンにしたりもしてみましたがだめでした。 過去ログや、Webで昨日さんざん調べてみて、確認したのは以下の設定です。 (1) C:\Program Files\MySQL\MySQL Server 5.1\my.ini: [mysqld] character-set-server = utf8 collation-server = utf8_general_ci init-connect = SET NAMES utf8 [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 (2) C:\Inetpub\wwwroot\phpMyAdmin\libraries\config.default.php $cfg['DefaultLang'] = 'utf-8'; $cfg['DefaultConnectionCollation'] = 'utf8_general_ci'; $cfg['DefaultCharset'] = 'utf-8'; (3) MySQL Server Instance Config Wizard UTF8を選択しました(MySQL の文字セット: UTF-8 Unicode (utf8)) MySQL 接続照合順序 utf8_general_ci

    • ベストアンサー
    • PHP

専門家に質問してみよう