如何在PHP中使用fgetcsv()来处理日语字符


How do I get fgetcsv() in PHP to work with Japanese characters?

我有以下数据是从谷歌电子表格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
}

因此,在使用fopenfgetcsv时,似乎跳过了日语字符。

我的文件保存为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";
}