将文件内容输出为 UTF-8 会导致字符编码问题

Posted

技术标签:

【中文标题】将文件内容输出为 UTF-8 会导致字符编码问题【英文标题】:Outputting file contents as UTF-8 leads to character encoding issues 【发布时间】:2014-01-15 08:13:33 【问题描述】:

我将标题设置如下:

header( 'Content-Type: text/html; charset="utf-8"' );

然后使用以下代码段将我服务器上的本地文件输出到浏览器:

$content = file_get_contents($sPath);
$content = mb_convert_encoding($content, 'UTF-8');
echo $content;

我在服务器上的文件是由 lua 创建的,因此,以下输出是 FALSE(转换前):

var_dump( mb_detect_encoding($content) );

这些文件包含一些字符,如 (™) 等,这些字符在浏览器中显示为纯方框。我已经阅读了以下被建议为类似问题的主题,并且我的代码中的任何变化都没有帮助:

php File Get Contents & String Encoding(在我的情况下没有 gzip,文件很简单 .txts) file_get_contents() Breaks Up UTF-8 Characters(尝试了前两个***解决方案,但均无效。第三个不适用于我的情况) file_get_contents() converts UTF-8 to ISO-8859-1(没有流作为上下文提供)

当我简单地使用以下时似乎没有问题:

header( 'Content-Type: text/html; charset="iso-8859-1"' );
// setting path here
$content = file_get_contents($sPath);
echo $content;

【问题讨论】:

该字符串似乎是有效的 iso-8859-1。您是否尝试过简单的 utf8_encode 而不是 mb_convert_encoding? @db-mobile 是的,我确实尝试过。结果还是那个方块。 您的浏览器显示检测到的编码是什么? @db-mobile Opera Dragonfly 将字符集检测为 UTF-8 您是否也尝试过不进行转换就输出文件? 【参考方案1】:

当我简单地使用以下时似乎没有问题:

header( 'Content-Type: text/html; charset="iso-8859-1"' );
// setting path here
$content = file_get_contents($sPath);
echo $content;

所以这意味着文件内容实际上是用 ISO-8859-1 编码的。如果您想将其输出为 UTF-8,则从 ISO-8859-1 显式转换为 UTF-8:

$content = mb_convert_encoding($content, 'UTF-8', 'ISO-8859-1');

你总是需要知道你从什么转换。只是告诉 PHP “转换为 UTF-8”并让它猜测要转换的内容 有一个未定义的结果,在你的情况下它不起作用。

【讨论】:

但是mb_detect_encoding($content) 的结果是假的。 mb_convert_encoding($content, 'UTF-8', 'ISO-8859-1'); 也不起作用。 永远不要指望mb_detect_encoding 所说的任何东西,以任何程度的准确度检测编码基本上是不可能的。您首先需要知道的是文件的实际编码是什么。如果不知道,您将无法到达任何地方。 file --mime myfile.txt 给出:text/plain; charset=unknown-8bit。正如我所说,这些文件是用 lua 创建的。 即使是 lua 也必须以 some 已知的指定编码写入文件。弄清楚那是什么。也许你可以让它直接写UTF-8。【参考方案2】:

检查文件编码,是utf-8 without BOM吗?例如,使用 notepad++ 检查文件编码。

或者也许有用:

$content = file_get_contents($sPath);
$content = htmlentities($content);
echo $content;

或在 .htaccess 中尝试:

AddDefaultCharset utf-8
AddCharset utf-8 *
<IfModule mod_charset.c>
    CharsetSourceEnc utf-8
    CharsetDefault utf-8
</IfModule>

【讨论】:

命令 file 02_01_2014.txt 返回:非 ISO 扩展 ASCII 文本,行很长 对于转换,您可以使用iconv,它是从GNU/Linux 上的libc 包安装或重新编码的。 recode 有更多选项和更好的错误处理。也许它对你有用? 我无法转换磁盘上的文件。对不起。 :( 这没有任何结果。根本没有输出。使用htmlentitieshtmlspecialchars 你有什么错误吗?如果我理解正确,您想将浏览器中的普通方框替换为普通符号吗?

以上是关于将文件内容输出为 UTF-8 会导致字符编码问题的主要内容,如果未能解决你的问题,请参考以下文章

txt文本文档打开全都是乱码

关于乱码

MATLABUTF-8编码文本输出

Excel·将Excel数据源转成编码为UTF-8的文本文件

ant编译报错“错误: 编码UTF-8的不可映射字符”

loadrunner将参数文件转换为UTF-8编码