强制对字符串进行ANSI编码(CP1252,ISO8859),强制下载时获取UTF-8编码

时间:2014-08-20 09:28:46

标签: php codeigniter encoding utf-8 ascii

如果我把它放在我的起始字符串上:

echo mb_detect_encoding($string);

我得到了值:

  

ASCII

将下载此字符串。我认为它是UTF-8,因为它是PHP和数据库的默认编码。它的文件扩展名为.DAT,我已经以这种方式将其添加到config/mimes.php

'DAT' => 'text/plain; charset=ISO-8859-1'

然后,如果我尝试下载该字符串,使用Codeigniter的下载帮助程序(假设我已经加载了帮助程序)

force_download('MYFILE.DAT', $string);

通过F12进行调试,响应头如下:

Content-Disposition:attachment; filename="MYFILE.DAT"
Content-Length:21024
Content-Transfer-Encoding:binary
Content-Type:"text/plain; charset=ISO-8859-1"

但是当我在Notepad ++中打开这个文件时,它似乎是以UTF-8编码而没有BOM。

enter image description here

我甚至尝试应用iconv以及mb_convert_encoding,就好像字符串是在utf-8中一样(尽管mb_detect_encoding告诉我字符串是ASCII):< / p>

iconv("UTF-8", "ISO-8859-1", $string);
iconv("UTF-8", "CP1252", $string);
/* ... and so on ... */

也试过

mb_convert_encoding($string, "ISO-8859-1");
mb_convert_encoding($string, "CP1252");
/* ... and so on ... */

但显然,结果相同。字符串似乎是ISO-8859如果我做了var_dump(重音是混乱的)但是在下载之后,似乎仍然以UTF-8编码(重音又回来了!)

我在这里缺少什么?我究竟做错了什么?我应该先写文件然后强制下载吗?

已解决

问题是开始的字符集。它似乎在ISO-8859-1中。尽管@deceze对于您无法在纯文本文件中指定编码这一事实绝对正确,但您实际上能够编码其内容,我的意思是字符。

1 个答案:

答案 0 :(得分:2)

您无法以任何一致性或准确度衡量检测编码。 ASCII文件在ISO-8859或UTF-8或任何其他ASCII兼容编码中同样有效。 PHP默认调用它为ASCII,Notepad ++默认调用它为UTF-8。这两项决定同样有效。由于&#34;实际&#34;编码不会存储在文件中的任何位置或文件的元数据中(即使您设置了HTTP标头),也没有&#34;对&#34;答案。