開発ブログ

ページメニュー

<< Amazon APIのサンプル〜『マニアンミュージック』 | main | ドラクエ5のブログで使った主人公の名前を変更する処理 >>

カレンダー

<< April 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>

  • fgetcsvで配列がズレた時〜5c問題
  • PHPにはfgetcsvという関数が用意されています。この関数を使うことにより、引用符の中の区切り文字について頭を悩ます必要がなくなったのですが、時々こっちの予想通りにデータを収納してくれません。

    例えば
    "1","新宿十中テニス部","2勝3敗",A
    というデータがあって、
    $data = fgetcsv($fh, 0, "," , "¥"")
    としていれば、
    • $data[0]="1";

    • $data[1]="新宿十中テニス部";

    • $data[2]="2勝3敗";

    • $data[3]="A";

    となってほしいのですが、そうなってくれないことがあります。
    同様の症状が突然お客様から電話があって、しばし思考が止まりました。電話を切って、
    「例のアレかも?」
    と思って調べてみたら案の定。
    いわゆる5c問題といわれるもので、昔、チャットなどを作っていた時に散々悩まされたもんです。

    これは、文字コードの2バイト目が0x5c(¥)となるもの。「¥」になってしまうと、正しく表示できなくなっちゃいますね。

    今回のケースだと「十」という文字でひっかかっていたわけです。有名なところだと「予、表、申、ソ、兎、曾、圭、欺、噂・・・」などがあります。

    参考サイト
    5c問題 - マイドキュメント - livedoor Wiki(ウィキ)

    上記サイトだと、下記のような回避方法が書かれていました。
    通常はこのように書くところを
    const char msg[] = "予定表"; 
    このようにします。
    const char msg[] = "予¥定表¥"; 
    これは、文字コードがShift_JISの時に起きる問題なので、一度読み込んだファイルはUTF-8mb_convert_encodingした上で読み直す、といった対処が有効であると思います。

    冷静になれば、気づく問題なのですが、休みの日の昼下がりに急にお客様に言われたりすると思い出せなかったりすることがあるので、メモとして残しておきます。

| 開発関連 | 18:35 | comments(0) | trackbacks(0) |


コメント

コメントする

この記事のトラックバックURL

http://blog.24th.jp/trackback/930390