经过几个小时的研究(几次…),我发布了这篇文章。我还找不到任何答案。
我的目标是使用PHP编写一个CSV文件。这个文件必须有中文ANSI编码(我想简体中文是GB2312,在记事本++中我只看到ANSI作为编码)。必须导入到另一个工具。
[重要提示]
我们目前正在用记事本++和一台以中文为默认语言的电脑转换一个文件。过程是:
- 从web应用程序获取UTF8 CSV
- 在中国PC上用Excel 2003保存为csv
- 在记事本++中打开,编码已经是ANSI,删除文件开头的一个前导"?"
我运行了一个测试:将我的.csv文件更改为.php,并用以下代码替换它以保持相同的编码:
<?php echo mb_detect_encoding("test"); ?>
这将打印:"ASCII"。
那么我不确定我的CSV:GB2312的输出应该是什么?,ASCII?,安西?。我甚至不清楚它们之间的区别。
我还读到一个用Excel 2007保存为CSV的文件,用中文PC保存就可以了。
[/重要提示]
目前,我没能把它做好!当我打开notepad++中的文件时,它仍然显示编码为UTF-8编码。很明显,因为汉字看起来很好看,它们应该看起来"坏":-)。
我使用以下标题条件:
header("Content-type: text/csv; charset=GB2312");
header("Content-Disposition: attachment; filename=$filename.csv");
header("Content-Transfer-Encoding: binary");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Expires: 0");
[附加信息]
我的文件编码方式是(为了方便起见,我把它抽象了)
//header, hard coded in Chinese
$csv = "东西,东西,东西'n"; //example "stuff,stuff,stuff"
[...]
//write line by line, status is also hard coded (行)
$csv .= $DB_data_1.",".$DB_data_2.",行'n"; //行=OK
[/其他信息]
在打印之前,我还使用iconv将CSV字符串转换为GB2312(也尝试了mb_convert_encoding)
setlocale(LC_ALL,'zh_CN');
$csv = iconv("UTF-8","GB2312",$csv);
echo($csv);
我的.php文件是用UTF-8编码编写的(不是没有BOM的UTF-8)
基本上,我总是得到UTF-8文件作为输出,我需要ANSI。看起来有太多的参数/属性,我没有弄清楚。非常感谢您的帮助!
谢谢!
David
[附加信息]
例如,在我的标题的列上,将有以下编码更改:
- 在PHP源代码(UTF-8文件,英文计算机)中:商品序号(意思是:SKU,商品代码)
- 在最终的CSV文件(ANSI文件,英文计算机)中:
- 在最终CSV文件(ANSI文件,中文计算机)中:商品序号
[/附加信息]
string mb_convert_encoding(字符串$str,字符串$to_encoding[,混合$from_encoding])
请注意,第二个参数是编码。所以应该是
$csv = mb_convert_encoding($csv, "GB2312", "UTF-8");
您发送的HTTP头只指定给客户端您要回复的字符集,它不会为您转换内容。因此,如果您指定charset=GB2312
,但发送utf8,那么您只是在撒谎。无论如何,charset属性在这里没有任何意义,因为内容无论如何都是以二进制形式传输的。
你需要做的是在发送之前转换内容。Iconv或mbstring是合适的工具。首先要确保你知道你的数据来自哪个字符集。假设它是从某个地方加载的(比如数据库)。因此,考虑到你有点迷路了,很有可能它不是你想象的那样。例如,它很可能是iso-8859-1,而不是utf-8。
一旦你确定它确实是utf-8,就使用你已经尝试过的iconv:
$csv = iconv('UTF-8', 'GB2312', $csv);
假设$csv
是一个字符串,包含csv文件。