Как заставить fgetcsv() в PHP работать с японскими символами?

У меня есть следующие данные, генерируемые из RSS-канала электронной таблицы Google.

いきます,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.

Спасибо


person Chris    schedule 06.06.2011    source источник


Ответы (5)


Я не могу добавить комментарий к ответ от Дариена

Воспроизводю проблему, после смены локали проблема решилась. Вы должны установить jp locale на сервер, прежде чем пытаться повторить это.

Ubuntu Добавьте новую строку в файл /var/lib/locales/supported.d/local

ja_JP.UTF-8 UTF-8

И запустить команду

sudo dpkg-reconfigure locales

Or

sudo locale-gen

Debian Просто выполните "dpkg-reconfigure locales" и выберите необходимые локали (ja_JP.UTF-8)

Я не знаю, как это сделать для других систем, попробуйте выполнить поиск по ключевым словам "locale-gen locale" для вашей серверной ОС.

В файле php перед открытием файла csv добавьте эту строку

setlocale(LC_ALL, 'ja_JP.UTF-8');
person Empty    schedule 14.06.2011

Похоже, это может быть то же самое, что и ошибка PHP 48507.

Пробовали ли вы изменить настройки PHP locale перед запуском кода и сбросить его после этого? ?

person Darien    schedule 06.06.2011
comment
Хм, похоже, это соответствует ошибке. Я попробую настройку локали и посмотрю, будет ли это иметь значение - person Chris; 07.06.2011
comment
Я не могу воспроизвести проблему на своем компьютере с Linux. (Скопируйте и вставьте хирагану в файл CSV.) По умолчанию я считаю, что он работает как en_US.utf8. - person Darien; 14.06.2011

Вы можете рассмотреть эту библиотеку. Я помню, как использовал его некоторое время назад, и он намного удобнее, чем встроенные функции PHP для обработки файлов CSV. がんばって!

person LainIwakura    schedule 16.06.2011

Может вам поможет кодировка символов iconv

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

person Sanjeev Chauhan    schedule 20.06.2011

Вы можете сделать это вручную, не используя 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";
}
person sanmai    schedule 20.06.2011