【发布时间】:2010-09-03 16:39:11
【问题描述】:
类似问题:
Some characters in CSV file are not read during PHP fgetcsv(),
fgetcsv() ignores special characters when they are at the beginning of line
我的应用程序有一个表单,用户可以在其中上传 CSV 文件(它的 5 个内部用户始终上传一个有效文件 - 逗号分隔、引用、记录以 LF 结尾),然后使用PHP:
$fhandle = fopen($uploaded_file,'r');
while($row = fgetcsv($fhandle, 0, ',', '"', '\\')) {
print_r($row);
// further code not relevant as the data is already corrupt at this point
}
由于我无法更改的原因,用户正在上传以 Windows-1250 字符集编码的文件 - 一种单字节 8 位字符编码。
问题:一些(不是全部!)超过 127 个字符(“扩展 ASCII”)被丢弃在 fgetcsv() 中。示例数据:
"15","Ústav"
"420","Špičák"
"7","Tmaň"
变成
Array (
0 => 15
1 => "stav"
)
Array (
0 => 420
1 => "pičák"
)
Array (
0 => 7
1 => "Tma"
)
(注意č 被保留,但Ú 被删除)
fgetcsv 的文档说“因为 4.3.5 fgetcsv() 现在是二进制安全的”,但看起来不是。我做错了什么,还是这个函数坏了,我应该寻找一种不同的方法来解析 CSV?
【问题讨论】:
-
我马上回答,这个bug之前咬过我,已经找到原因了;想和 SO 分享这个,因为这个 bug 微妙。
-
(澄清一下,Win-1250 只是输入编码。数据随后以 UTF-8 格式转换并存储在数据库中;该部分工作正常。最初读取的数据是问题所在。)
标签: php csv character-encoding