我有以下数据是从谷歌电子表格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
方法显示字符。
感谢
我无法向Darien的答案添加注释
我重现了这个问题,在更改了一个区域设置后,问题得到了解决。在尝试重复此操作之前,必须在服务器上安装jp语言环境。
Ubuntu向文件/var/lib/locates/supported.d/local 添加新行
ja_JP.UTF-8 UTF-8
并运行命令
sudo dpkg-reconfigure locales
或
sudo locale-gen
Debian只需执行"dpkg重新配置区域设置"并选择必要的区域设置(ja_JP.UUTF-8)
我不知道其他系统该怎么做,试着用关键字"locale-gen-locate"搜索你的服务器操作系统。
在php文件中,在打开csv文件之前,添加以下行
setlocale(LC_ALL, 'ja_JP.UTF-8');
这看起来可能与PHP Bug 48507相同。
您是否尝试过在运行代码之前更改PHP区域设置,然后再重置它?
您可能需要考虑这个库。我记得以前使用过它,它比处理CSV文件的内置PHP函数要好得多。がんばって!
可能是iconv字符编码帮助您
http://php.net/manual/en/function.iconv.php
您可以手动完成,而不使用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";
}