2011-06-06 94 views
5

我有從谷歌電子表格rss飼料生成以下數據。如何在PHP中使用fgetcsv()來處理日文字符?

いきます,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方法顯示字符。

感謝

回答

3

我無法從達裏恩

我重現問題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」服務器OS。

在php文件,在開放之前csv文件,加入這一行

setlocale(LC_ALL, 'ja_JP.UTF-8'); 
3

這看起來似乎是一樣的PHP Bug 48507

您是否嘗試過在運行代碼之前更改您的PHP locale設置並在之後將其重置?

+0

嗯,看起來似乎它匹配錯誤。我會嘗試語言環境設置,看看是否有所作爲 – Chris 2011-06-06 21:30:00

+0

我無法在Linux機器上重現問題。 (將平假名複製粘貼到CSV文件中。)默認情況下,我相信它是以'en_US.utf8'的形式運行的。 – Darien 2011-06-14 18:03:57

0

你可能要考慮this庫。我記得有一段時間使用它,它比內置的PHP函數處理CSV文件好得多。がんばって

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"; 
} 
相關問題