CSVをSplFileObjectで解析できなかった話

Windows10上でxamppにphp7を入れた状態でプログラムを書いていました。
CSVをSplFileObjectで解析できず、2日くらい悩まされたので、忘れないように書いておきます。

SplFileObjectを使う直前までに以下のコードを書くことで解決しました。
setLocale(LC_ALL, 'English_United States.1252');

以下のページを運良く見つけられたので、解決することが出来ました。
ありがたや。。
https://github.com/EC-CUBE/ec-cube/issues/1780

私は以下のような流れでWEBページからアップロードされたCSVを解析するプログラムを作成しようとしていました。
CSV(Excellから出力)をbase64エンコードしたデータがWebページから投げられてくる。
・それをデコードしてUTF8でサーバー上にファイルとして保存。
・保存したUTF8のCSVファイルをSplFileObjectで解析する。

CSVファイルをSplFileObjectで解析しようとすると、たまに幾つかのセルが一つにつなげられて失敗していました。
しかしSplFileObjectならCSVをうまく解析できるとどこのサイトでも書かれていたので、出来ないのは自分が悪いのか…と悩み続けました。

今回はPHP7でCakephp3という比較的新しめなシステムの組み合わせだったので、もしかしてと思って調べ始めたのが3日目の朝。

参考にしたサイトによると、Windows環境のみで発生するのかな?
Windows以外の環境はないので調べられないけど。

灯バージョンアップ。Unicode対応修正。ゴースト公開。

灯をバージョンアップしました。
以下のUnicode対応ができていなかった関数を修正。
・_speak
・_strsplit
・_sprintf

灯のサンプルゴースト2体目を公開しました。
Unicode対応のテストも兼ねて作っていたものです。
改変・再配布不自由です。

灯バージョンアップ。Unicode対応についての修正。

灯をバージョンアップしました。
修正点は以下の点。
・_script_load関数のUnicode対応。
・_customrequestのUnicode対応。

追加した関数は以下の関数です。
・string _wrappedstr( string 対象文字列, string 開始タグ, string 終了タグ, int 開始位置 )

_wrappedstrは、例えばHTMLタグや複雑にネストした括弧を含む文字列を解析するときに役に立つかもしれません。

灯バージョンアップ。Unicode対応。

Unicodeに対応できるようにしました。
Ver 2.00にしました。

具体的な変更点は以下になります。
・「.azr」という拡張子のスクリプトファイルは全てUTF-8という文字コードで読み込まれるように。
・_httpgetの第二引数、_readtextの第二引数、_writetextの第三引数で"utf8"を指定すると、UTF-8で読み込まれるように。
 (今までは一旦Shift_JISに変換されていた)
ベースウェアへのレスポンスをCharaset: UTF-8で返すように。

※_httpget、_readtext、_writetextといった外部のファイルを扱う関数について、
文字コードを指定しない場合は今までどおりShift_JISとして読もうとするので、utf8を指定するようにして下さい。

それと、サイトをリニューアルしました。

頂いたメールへの回答

1月18日に頂いたメールに回答させて頂きます。

有難うございます。
説明が足りなくて申し訳ありませんでした。

GhostCageについてですが、SHIORISAORIのようなモジュールではなく、GhostCageだけで動かすことを想定した作りになっております。

つまり、GhostCageと同じフォルダにdescript.txtとSHIORIを置いて、GhostCageをダブルクリックして起動するという使い方になります。

ゴーストから起動する場合は、exec.dllのような外部のプログラムを実行するSAORIを使用する必要があります。


でも、SSPやmateriaで動作中のゴーストから使用できたほうが面白そうですね!
近いうちにSAORIのようなプログラムとして、ゴーストからGhostCageのウィンドウ内の表示を自由に変えることが出来るように改良しようと思っています。

灯のバージョンアップ。GhostCage公開。

灯のバージョンが1.99になりました。
以下の関数を追加しました。

string _base64encode( string 変換したい文字列 );
string _base64decode( string 変換したい文字列 );
int _keystate( string(or int) 仮想キーコード );
dict _joypadstate();

それと、栞を使ってゲームのようなものを作れるかもしれないプログラムを作りました。
倉庫にGhostCageという名前で置いておきました。
http://le.silk.to/?p=dll