У меня есть следующие данные, генерируемые из 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.
Спасибо
Ответ 1 · рейтинг 3 · Empty
Я не могу добавить комментарий к ответ от Дариена
Воспроизводю проблему, после смены локали проблема решилась. Вы должны установить 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');
Ответ 5 · sanmai
Вы можете сделать это вручную, не используя 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";
}