PHP fputcsv с проблемой UTF-8 - PullRequest
       16

PHP fputcsv с проблемой UTF-8

1 голос
/ 28 января 2011

Я пытаюсь разрешить моим клиентам просматривать некоторые данные MySQL в Excel.Я использовал PHP-функцию fputcsv (), например:

public function generate() {
   setlocale(LC_ALL, 'ko_KR.UTF8');

   $this->filename = date("YmdHis");
   $create = $this->directory."Report".$this->filename.".csv";

   $f = fopen("$create","w") or die("can't open file");
   fwrite($f, "\xEF\xBB\xBF");

   $i = 1;
   $length = count($this->inputarray[0]);

   fwrite($f, $this->headers."\n");

   // print column titles
   foreach($this->inputarray[0] as $key=>$value) {
    $delimiter = ($i == $length) ? "\n\n" : ",";
    fwrite($f, $key.$delimiter);
    $i++;
   }

   // print actual rows
   foreach($this->inputarray as $row) {
    fputcsv($f, $row);
   }
   fclose($f);
  } 

Мои клиенты корейцы, и хороший кусок базы данных MySQL содержит значения в utf8_unicode_ci.Используя вышеупомянутую функцию, я успешно сгенерировал файл CSV с правильно закодированными данными, который прекрасно открывается в Excel на моем компьютере (Win7 на английском языке), но когда я открыл файл в Excel на клиентском компьютере (Win7 на корейском языке), символыбыли сломаны снова.Я попытался извлечь заголовок (\ xEF \ xBB \ xBF) и закомментировать setlocale, но безрезультатно.

Можете ли вы помочь мне разобраться в этом?

Ответы [ 3 ]

1 голос
/ 28 января 2011

Если, как вы говорите, ваш CSV-файл содержит «правильно закодированные данные» - то есть он содержит действительный поток байтов UTF-8 и предполагает, что поток байтов файла на сайте вашего клиента то же самое (например, не был поврежден при передаче из-за проблемы с передачей файлов), тогда это звучит как проблема Excel на компьютере клиента, неправильно интерпретирующая UTF-8. Это может быть связано с тем, что он не поддерживается или что при импорте необходимо выбрать какую-либо опцию, чтобы указать кодировку. Таким образом, вы можете попробовать создать файл в другой кодировке (используя mb_convert_encoding или iconv).

Если вы заставите своего клиента экспортировать CSV, содержащий корейские символы, тогда вы сможете взглянуть на этот файл и определить кодировку, которая создается. Затем вы должны попробовать использовать эту кодировку.

0 голосов
/ 28 января 2011

Попробуйте кодировать данные как UTF-16LE и убедитесь, что файл имеет соответствующую спецификацию.

В качестве альтернативы, отправьте своим клиентам файл Excel, а не CSV, тогда кодировка не должна быть проблемой

0 голосов
/ 28 января 2011

Попробуйте обернуть текст в каждом вызове fwrite с помощью utf8_encode.

Тогда используйте то, что предлагается здесь: http://www.php.net/manual/en/function.fwrite.php#69566

...