1

经过几个小时的研究(几次......),我发布了这个。我还没有找到任何答案。

我的目标是使用 PHP 编写一个 CSV 文件。这个文件必须有中文ANSI编码(我想简体中文是GB2312,在notepad++中我只看到ANSI编码)。必须导入到另一个工具。

[重要的提示]

我们目前正在使用 notepad++ 和一台默认语言为中文的 PC 转换文件。过程是:

  • 从网络应用程序获取 UTF8 CSV
  • 在中国电脑上用 Excel 2003 保存为 csv
  • 在notepad++中打开,编码已经是ANSI,删除一个前导“?” 在文件的开头。

我进行了测试:将我的 .csv 文件更改为 .php 并用以下代码替换它以保持相同的编码:

<?php echo mb_detect_encoding("test"); ?>

这将打印:“ASCII”。

然后我不确定CSV的输出应该是什么:GB2312?,ASCII?,ANSI?。我什至不清楚它们之间的区别。

我还读到,使用 Excel 2007 保存为 CSV 格式的文件在中国 PC 上适用于该工具。

[/重要的提示]

目前,我无法做到正确!当我打开我在记事本++中得到的文件时,它仍然显示编码为 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。看起来有这么多参数/属性,我不明白。您的帮助将不胜感激!

谢谢!

大卫

[附加信息]

例如,在我的标题列上将有以下编码更改:

  • PHP源代码中(UTF-8文件,英文电脑):商品序号(意思是:SKU,商品代码)
  • 在最终的 CSV 文件(ANSI 文件,英文计算机)中:ÉÌÆ·ÐòºÅ
  • 在最终的 CSV 文件(ANSI 文件,中文电脑)中:商品序号

[/附加信息]

4

2 回答 2

1

字符串 mb_convert_encoding ( 字符串 $str , 字符串 $to_encoding [, 混合 $from_encoding ] )

注意第二个参数是编码。所以应该是

$csv = mb_convert_encoding($csv, "GB2312", "UTF-8");
于 2012-07-27T10:40:06.680 回答
1

您发送的 HTTP 标头仅向客户端指定您要回复的字符集 - 它不会为您转换内容。因此,如果您指定charset=GB2312,但发送 utf8,那么您只是在撒谎。在任何情况下,charset 属性在这里没有任何意义,因为内容无论如何都是以二进制形式传输的。

您需要做的是在发送内容之前对其进行转换。Iconv 或 mbstring 是合适的工具。首先确保您知道您的数据来自什么字符集。大概它是从某个地方(如数据库)加载的。所以考虑到你有点迷茫,很有可能它不是你想象的那样。例如,它很可能是 iso-8859-1 而不是 utf-8。

一旦您确定它确实是 utf-8,请使用您已经尝试过的 iconv:

$csv = iconv('UTF-8', 'GB2312', $csv);

假设这$csv是一个字符串,包含 csv 文件。

于 2012-07-27T10:40:24.850 回答