问题转换为使用excel在mac上制作的utf-8 csv文件

时间:2015-01-29 03:25:08

标签: php excel csv

我是一个有编码的新手。 我有一个允许用户上传csv文件的php文件。

我的问题是,当使用excel for mac创建文件时,如果文件包含utf-8字符(如重音字母),我的代码将无法正常工作。基本上它会忽略重音字符。

仅当使用Comma separated values选项保存文件时才会出现问题。

在所有其他情况下,例如在Windows中制作的文件或使用开放式办公室,甚至可以在Mac上使用excel,但将其保存为“Windows'文件不会造成任何问题。

mb_detect_encoding为文件返回false导致麻烦。

这是代码:

// say there is the word Nestlé in the file
$content = file_get_contents(addslashes($file_name));

var_dump(mb_detect_encoding($content)); // print false


$data  = mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
            //$data  = utf8_encode($content);  //doesn't work

var_dump($data); // print Nestl

ini_set('auto_detect_line_endings',TRUE);

// more code here we don't need at the moment

这个问题给了我一些指示:file_get_contents() Breaks Up UTF-8 Characters

有关如何解决此问题的任何帮助或想法?提前谢谢

这是安东尼发布的回复后的新代码

$content = file_get_contents(addslashes($file_name));
// i have no control on how the file is generated so i need to to the replace in the code
$content = str_replace(",", "\t",  $content);
var_dump($content);
$data  = mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));


$data =  mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
$data = chr(255) . chr(254) . $data;

var_dump($data); // this still print funny characters not the accented letter

我做错了吗?

2 个答案:

答案 0 :(得分:2)

这是特定于Excel的问题,在Excel for Mac上更常见,其中UTF-8多字节字符未正确显示。您可以使用其他电子表格查看器进行确认,例如Google表格。

解决方法是:

  1. 使用标签(\t)代替逗号作为分隔符(不用担心,它在技术上仍然是CSV)。

  2. 编码为utf-8后,将整个csv字符串转换为UTF-16LE:

    mb_convert_encoding($csv_content, 'UTF-16LE', 'UTF-8');

  3. 使用little-endian字节顺序标记(LE BOM)作为csv字符串的前缀:

    $csv_content = chr(255) . chr(254) . $csv_content;

  4. 这应该这样做。

答案 1 :(得分:0)

好的,谢谢你,安东尼,这是解决问题的路线:

$data = iconv('macintosh', 'UTF-8', $content);

所以我的最终代码看起来像这样:

enter code here

$content = file_get_contents(addslashes($file_name));

var_dump(mb_detect_encoding($content));
// need to do this for an issue specific to Excel and more common on Excel for Mac
// using excel on mac if the file is saved as csv using the Comma separated values option we need to use iconv and not mb_convert_encoding
// we use mb_detect_encoding because the content of such file returns a false value
if(!mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true)){
     //$data  = mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, ISO-8859-1', 'macintosh', true));

      $data = iconv('macintosh', 'UTF-8', $content);


 } 
    // deal with known encoding types
 else{
         $data  = mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
 }