[PHP-users 30058] Re: fgetcsv関数について
Tadashi Jokagi
ml @ elf.no-ip.org
2006年 8月 17日 (木) 10:38:16 JST
ぢょ〜@よくきたなです.
日本情報電信)兵頭さんの「[PHP-users 30056] fgetcsv関数について」から
>しているのですが、fgetcsv関数にて「、」区切りの「”」を囲み文字としていた
>のですが
>とある文字列で「”」が上手く認識されず意図しない動作をします。
fgetcsv の区切り文字は 1 バイトのみ使用できるので,マルチバイト
は使用できません.下記コード.
PHP_FUNCTION(fgetcsv)
{
char delimiter = ','; /* allow this to be set as parameter */
char enclosure = '"'; /* allow this to be set as parameter */
const char escape_char = '\\';
(snip)
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|Zss",
&fd, &len_zv, &delimiter_str, &delimiter_str_len,
&enclosure_str, &enclosure_str_len) == FAILURE) {
return;
}
if (delimiter_str != NULL) {
/* Make sure that there is at least one character in string */
if (delimiter_str_len < 1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "delimiter must be a character");
RETURN_FALSE;
}
/* use first character from string */
delimiter = delimiter_str[0];
}
↑この辺
#マニュアルの「 1 文字」って修正した方がいいなぁ
多分言いたいことは半角の「,」「"」だと思うのですが,とある文字
は明確にした方がいいでしょう.おそらく,上記で「escape_char」に
バックスラッシュが指定されているので,「表」などいわゆる 5CH 問題
じゃないかと思います.
$ echo -n "表" | iconv -f UTF-8 -t Shift_JIS | od -tx1
0000000 95 5c
0000002
$ echo -n "\\" | iconv -f UTF-8 -t Shift_JIS | od -tx1
0000000 5c
0000001
一旦 Shift_JIS 以外の文字列に変更して一時ファイルを作成し,それを
読み込むのが実装の手間としては一番簡単だと思います.
#popen とかで "cat <FILE> | iconv -f Shift_JIS -t EUC-JP" とか指定し
て出力のファイルディスクリプタを読み込むってのもありかも(面倒くさ…
--
----.----1----.----2----.----3----.----4----.----5----.----6----.----7
Tadashi Jokagi/Shibuya city mailto:elf @ elf.no-ip.org
YokukitanaII http://elf.no-ip.org/
Yokukita blog http://blog.poyo.jp/
Yokukita wiki http://wiki.poyo.jp/
PHP-users メーリングリストの案内