Как заставить fgetcsv () в PHP работать с японскими символами? - PullRequest
5 голосов
/ 07 июня 2011

У меня есть следующие данные, генерируемые из 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.

Спасибо

Ответы [ 5 ]

3 голосов
/ 14 июня 2011

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

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

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

ja_JP.UTF-8 UTF-8

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

sudo dpkg-reconfigure locales

Или

sudo locale-gen

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

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

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

setlocale(LC_ALL, 'ja_JP.UTF-8');
3 голосов
/ 07 июня 2011

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

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

0 голосов
/ 20 июня 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";
}
0 голосов
/ 20 июня 2011

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

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

0 голосов
/ 16 июня 2011

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

...