gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

fgetcsvがマジシャンな件について

マジシャン(手品師/手妻師/奇術師)は右手を高々とあげてふっと手を振ると、手の中の○○が鮮やかに消えます。
PHPはfgetcsvでCSVファイルを読み込ませると、ファイルの中の日本語が鮮やかに消えます。


………………勘弁してくれ orz


より正確には「”(ダブルクォーテーション)で囲まれていない文字」が消えるです。
ちなみに「部分的に”(ダブルクォーテーション)で囲んだ日本語」も、全滅しました。…まぁRFC違反ではあるのですがねこの書式は(ちなみにCSVRFC周りは以前 ( http://d.hatena.ne.jp/gallu/20060718/p1 )書いたので、よかったらご参照くださいませ)。
日本語の前に半角があると普通に受け取れます。
日本語の途中に半角があると「半角以降」うけとれます。
つまり
-日本語 => -日本語
日-本語 => -本語
となるわけです。
…とりあえずだめぽなのが確定したのでこれ以上は調べません。


あちこち調べてみたのですが。
まず setlocateを使う類のものは、いろいろ実験をしてみた限りでは「有効ではない」と感じられました。
具体的には。たとえば、ファイルをEUCにしたうえで

setlocale(LC_ALL, 'ja_JP.EUC');

と設定しても無駄でした orz
10分程度後の追記

setlocale(LC_ALL, 'ja_JP');

としておくと大分まし。ただ「OKだったりNGだったりな文字列があるらしい(伝聞)」ので、もうひとつ信用は仕切れません。


いくつかのサイトで「splitを使う」という方向性が示唆されてますが、CSVのフォーマット上これは当然ながらNGです。


したがって、残る手段は

  • 日本語はとにかく全部”(ダブルクォーテーション)で囲む

となるわけです。


……………ありえねぇよ orz


とりあえず俺的には「CSVパーサ@MagicWeapon」でカッティングしてからごりょごりょ処理できるですが。
…ほかの人どうするんだべさ?
んと…希望がありましたらcsvパーサまわり貼り付けるので(ちぃとでかいですが)、コメントにでも一言くださいませ。


っつか。マジな話、ほかでfgetcsvとかつかってるところってその辺どうしてるんでしょ?
割と真剣なぞです。