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

时间:2011-06-06 21:02:41

标签: php html unicode fopen

我从谷歌电子表格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方法显示字符。

由于

5 个答案:

答案 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字符编码帮助您

http://php.net/manual/en/function.iconv.php

答案 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";
}