Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 强制对字符串(CP1252,ISO8859)进行ANSI编码,强制下载时获得UTF-8编码_Php_Codeigniter_Encoding_Utf 8_Ascii - Fatal编程技术网

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

Php 强制对字符串(CP1252,ISO8859)进行ANSI编码,强制下载时获得UTF-8编码,php,codeigniter,encoding,utf-8,ascii,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的下载助手下载该字符串(假设我已经加载了该助手) 通过F12调试,响应

如果我在我的起始字符串上投射此值:

echo mb_detect_encoding($string);
我得到的值是:

ASCII码

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

'DAT' => 'text/plain; charset=ISO-8859-1'
然后,如果我尝试使用Codeigniter的下载助手下载该字符串(假设我已经加载了该助手)

通过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表

我甚至尝试应用
iconv
,以及
mb\u convert\u编码
,就像字符串是utf-8一样(尽管
mb\u detect\u编码
告诉我字符串是ASCII):

也试过

mb_convert_encoding($string, "ISO-8859-1");
mb_convert_encoding($string, "CP1252");
/* ... and so on ... */
但很明显,他们的结果是一样的。如果我进行
var_dump
(重音符号被弄乱了),字符串似乎是ISO-8859,但下载后,似乎仍然用UTF-8编码(重音符号又回来了!)

我错过了什么?我做错了什么?我应该先写文件,然后强制下载吗

已解决


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

您无法检测到任何一致性或准确性的编码。ASCII文件在ISO-8859或UTF-8或任何其他ASCII兼容编码中同样有效。PHP默认称之为ASCII,Notepad++默认称之为UTF-8。这两项决定同样有效。由于“实际”编码不存储在文件中的任何位置或文件的元数据中(即使您设置了HTTP头),因此没有“正确”的答案。

(7bit)ASCII是utf8的子集,因此每个ASCII文件也都是utf8OK,所以我缺少的是在该字符串中存储一些定义为普通ASCII编码的内容(开始/结束处的字节)?(目标程序需要一个ASCII文件,如果以utf8编码,它将不会打开,但是如果我将编码设置为ANSI,则在记事本++中它会工作)。无法将明文文件声明为ASCII。你所拥有的已经是你能得到的最好的了。这本身并没有什么问题,明白吗。那个软件文档有点混乱。它坚持要有一个ASCII文件作为其导入输入,所以我一直在尝试对一些已经很好编码的东西进行强制编码。文档完全符合这一要求。您唯一的问题是看到纯文本文件没有在任何地方声明其编码,由每个应用程序来检测/验证数据的编码。
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 ... */