我从谷歌电子表格RSS订阅源生成以下数据。
いきます,go,5
きます,come,5
かえります,"go home, return",5
がっこう,school,5
スーパー,supermarket,5
えき,station,5
ひこうき,airplane,5
使用PHP我可以执行以下操作:
$url = 'http://google.com.....etc/etc';
$data = file_get_contents($url);
echo $data; // This prints all Japanese symbols
但如果我使用:
$url = 'http://google.com.....etc/etc';
$handle = fopen($url);
while($row = fgetcsv($handle)) {
print_r($row); // Outputs [0]=>,[1]=>'go',[2]=>'5', etc, i.e. the Japanese characters are skipped
}
因此,当使用fopen
或fgetcsv
时,似乎会跳过日文字符。
我的文件保存为UTF-8,它有PHP标头将其设置为UTF-8,并且HTML头中有一个元标记将其标记为UTF-8。我不认为它是自己的文档,因为它可以通过file_get_contents
方法显示字符。
由于
答案 0 :(得分:3)
这看起来可能与PHP Bug 48507相同。
您是否尝试在运行代码之前更改PHP locale设置并在之后重置它?
答案 1 :(得分:3)
我无法在Darien
中向the answer添加评论我重现问题,在更改区域设置后问题得以解决。 在尝试重复此操作之前,必须在服务器上安装jp语言环境。
<强> Ubuntu的强> 在文件/var/lib/locales/supported.d/local
中添加一个新行ja_JP.UTF-8 UTF-8
并运行命令
sudo dpkg-reconfigure locales
或
sudo locale-gen
<强>的Debian 强> 只需执行“dpkg-reconfigure locales”并选择必要的语言环境(ja_JP.UTF-8)
我不知道其他系统是如何做的,请尝试使用关键字“locale-gen locale”搜索服务器操作系统。
在php文件中,在打开csv文件之前,添加此行
setlocale(LC_ALL, 'ja_JP.UTF-8');
答案 2 :(得分:0)
您可能需要考虑this库。我记得有一段时间使用它,它比用于处理CSV文件的内置PHP函数更好。がんばって!
答案 3 :(得分:0)
可能是iconv字符编码帮助您
答案 4 :(得分:0)
您可以手动执行此操作,而不是使用fgetcsv
和朋友:
<?php
$file = file('http://google.com.....etc/etc');
foreach ($file as $row) {
$row = preg_split('/,(?!(?:[^",]|[^"],[^"])+")/', trim($row));
foreach ($row as $n => $cell) {
$cell = str_replace('\\"', '"', trim($cell, '"'));
echo "$n > $cell\n";
}
}
或者你可以选择更精彩的闭包方式:
<?php
$file = file('http://google.com.....etc/etc');
array_walk($file, function (&$row) {
$row = preg_split('/,(?!(?:[^",]|[^"],[^"])+")/', trim($row));
array_walk($row, function (&$cell) {
$cell = str_replace('\\"', '"', trim($cell, '"'));
});
});
foreach ($file as $row) foreach ($row as $n => $cell) {
echo "$n > $cell\n";
}