当前位置: 首页 > 知识库问答 >
问题:

PHP-UTF-8转中文ANSI(GB2312?)-导出CSV文件

郭易安
2023-03-14

我在几个小时的研究后发布了这个(几次...)。我还找不到任何答案。

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

【重要提示】

我们目前正在转换一个带有记事本的文件和一台默认语言为中文的PC。这个过程是:

  • 从web-app获取UTF8 CSV
  • 保存为CSV与Excel 2003在中国PC上
  • 在记事本中打开,编码已经是ANSI,删除一个前导的?在文件的开头。

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

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

这将打印:“ASCII”。

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

我还了解到,用Excel2007将一个文件保存为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将我的CSVhtml" target="_blank">字符串转换为GB2312(还尝试了mb_convert_编码)

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、项目代码)

[/补充资料]

共有2个答案

屠瑞
2023-03-14

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

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

一旦你确定它确实是utf-8,就像你已经尝试过的那样使用iconv:

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

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

邵胜涝
2023-03-14

字符串mb_转换_编码(字符串$str,字符串$to_编码[,混合$from_编码])

注意第二个参数是编码。应该如此

$csv = mb_convert_encoding($csv, "GB2312", "UTF-8");
 类似资料:
  • 我有一些用ANSI编码的php脚本文件。现在我已经将我的网站转换为html5,我需要UTF-8中的所有内容,以便这些文件中的重音可以正确显示,而无需通过iconv()进行任何php转换。我使用记事本++在UTF-8上设置脚本编码并保存文件,大多数都很好,重音显示正确,只有主脚本现在阻止了一切,服务器只返回一个白页,没有任何错误消息,即使使用! 当我在记事本++中将编码更改为ANSI并保存文件而不做

  • 我已经被困在导出UTF-8 CSV与Windows Excel上显示乱码文本的汉字好几天了。我使用PHP,已经添加了BOM字节标记,并尝试编码,但没有运气。 它们在记事本、谷歌电子表格甚至Mac数字上都能很好地打开。但不是在客户要求的Excel上。使用记事本打开时,编码显示为UTF-8。如果我手动将其更改为UTF-8并保存,该文件将在Excel上正常打开。 似乎BOM字节标记不会保存在输出中,因为

  • 我用node.js生成一个utf-8编码的csv,然后在windows上双击打开它。Excel会启动,但某些特殊字符(如`、`、ü、ä、ö、ü...)无法正确显示。我想这是由于错误的编码。我保存了一个用Excel创建的新csv。我看到编码是Windows-1252。

  • 你好,我想写一个带有HEBREW文本的CSV。它写了一些符号,而不是希伯来文。下面是我的PHP代码。 我在互联网上查了一下,添加了“fputs($fp,$bom=(chr(0xEF).chr(0xBB).chr(0xBF))”,但没有成功。谁能帮帮我吗。 下面是我得到的结果。

  • 我试图保存一个字符串在希伯来文文件,同时有文件ANSI编码。恐怕所有的尝试都失败了。 PHP文件本身是UTF-8 这是我正在尝试的代码: 由于某种原因,返回false。 另一次尝试是: 这返回一个空字符串。当这不起作用时,将输出字符集更改为Windows-1255的工作。所以函数本身工作,但由于某种原因,它不转换为1252。 我运行这个函数之前和之后的和打印的结果 在图标之前编码是UTF-8,在图

  • 我正在处理一个使用UTF-8编码了两次的遗留文件。例如,编码点()本应编码为,但改为编码为(是的UTF-8编码,是的UTF-8编码)。 假设数据在CP-1252中编码,则执行第二次编码。 为了回到UTF-8编码,我使用了以下(似乎错误)命令 我的问题是iconv似乎无法转换回一些字符。更准确地说,iconv无法转换UTF-8表示形式包含映射到CP-1252中控制字符的字符。一个例子是代码点ρ():