【问题标题】:Forcing an ANSI encoding on string (CP1252, ISO8859), obtaining UTF-8 encoding when force download it强制对字符串(CP1252、ISO8859)进行ANSI编码,强制下载时获取UTF-8编码
【发布时间】:2014-08-20 09:28:45
【问题描述】:

如果我将它投射到我的起始字符串上:

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++ 中打开这个文件时,它似乎是用没有 BOM 的 UTF-8 编码的。

我什至尝试过应用iconvmb_convert_encoding,就好像字符串是utf-8 一样,(即使mb_detect_encoding 告诉我字符串是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 ... */

但显然,有相同的结果。如果我执行var_dump,字符串似乎是 ISO-8859(口音搞砸了),但下载后,似乎仍以 UTF-8 编码(口音又回来了!)

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

已解决

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

【问题讨论】:

  • (7bit) ASCII是utf8的子集,所以每个ascii文件也是utf8

标签: php codeigniter encoding utf-8 ascii


【解决方案1】:

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

【讨论】:

  • 好的,所以我缺少的是在该字符串中存储一些将其定义为纯 ASCII 编码的内容(开始/结束处的字节)? (目标程序需要一个 ASCII 文件,如果以 utf8 编码则不会打开,但是如果我将编码设置为 ANSI,则在 Notepad++ 中它可以工作)。
  • 没有办法将纯文本文件声明为 ASCII。你所拥有的已经是你能得到的最好的了。这里本身没有任何问题。
  • 明白。那个软件文档有点混乱。它坚持为其导入输入提供一个 ASCII 文件,所以我一直在尝试强制对已经编码好的东西进行编码。
  • 文档完全符合该要求。您唯一的问题是看到纯文本文件没有在任何地方声明其编码,并且由每个单独的应用程序来检测/验证数据的编码。
猜你喜欢
  • 2011-08-19
  • 2012-10-08
  • 2011-04-21
  • 2012-06-01
  • 1970-01-01
  • 2016-10-06
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多