我是一个有编码的新手。 我有一个允许用户上传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
我做错了吗?
答案 0 :(得分:2)
这是特定于Excel的问题,在Excel for Mac上更常见,其中UTF-8多字节字符未正确显示。您可以使用其他电子表格查看器进行确认,例如Google表格。
解决方法是:
使用标签(\t
)代替逗号作为分隔符(不用担心,它在技术上仍然是CSV)。
编码为utf-8后,将整个csv字符串转换为UTF-16LE:
mb_convert_encoding($csv_content, 'UTF-16LE', 'UTF-8');
使用little-endian字节顺序标记(LE BOM)作为csv字符串的前缀:
$csv_content = chr(255) . chr(254) . $csv_content;
这应该这样做。
答案 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));
}