将文件内容输出为 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) );
这些文件包含一些字符,如™
(™
) 等,这些字符在浏览器中显示为纯方框。我已经阅读了以下被建议为类似问题的主题,并且我的代码中的任何变化都没有帮助:
.txt
s)
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 有更多选项和更好的错误处理。也许它对你有用?
我无法转换磁盘上的文件。对不起。 :(
这没有任何结果。根本没有输出。使用htmlentities
或htmlspecialchars
你有什么错误吗?如果我理解正确,您想将浏览器中的普通方框替换为普通符号吗?以上是关于将文件内容输出为 UTF-8 会导致字符编码问题的主要内容,如果未能解决你的问题,请参考以下文章