【问题标题】:PHP iconv issue when converting to utf-8 with apache使用 apache 转换为 utf-8 时的 PHP iconv 问题
【发布时间】:2014-08-21 13:34:40
【问题描述】:

使用 PHP CLI,效果很好:

$result = iconv (LATIN1, 'UTF-8', N�n��;M�tt);

结果是:Nönüß

这也适用于 CP437、Windows、Macintosh 等。

在 apache 上,相同的代码导致:

$result = iconv (LATIN1, 'UTF-8', N�n��;M�tt);

结果是:Nönüß

我四处搜索并将setlocale(LC_ALL, "en_US.utf8"); 添加到脚本中,但没有任何区别。感谢您的帮助!

我使用 apache2 和 php 5.4 运行 Debian Linux。我正在尝试转换不同的 CSV 文件,因为它们正在上传到 UTF-8 进行处理。

更新:我找到了自己的解决方案。

$result = utf8_decode (iconv (LATIN1, 'UTF-8', N�n��;M�tt));

utf8_decode 使其在浏览器中正确显示并在保存到 MySQL 数据库时显示。

【问题讨论】:

    标签: php apache utf-8


    【解决方案1】:

    编码总是有两个方面:编码字符串,以及实体解释这个编码字符串为可读字符!这个“实体”,我会含糊其辞地称呼它,可以是数据库、浏览器、您的文本编辑器、控制台或其他任何东西。

    $result = iconv('LATIN1', 'UTF-8', 'N�n��;M�tt');
    

    结果是:Nönüß

    不确定你从哪里得到'N�n��;M�tt',但那里的 UNICODE REPLACEMENT CHARACTERS - 表明你试图将此字符串解释为 UTF-8,但该字符串实际上不是 UTF-8 编码的。使用 iconv 将其从 Latin-1 转换为 UTF-8 会显示正确的字符 - 这意味着该字符串最初是 Latin-1 编码的,并将其转换为您预期的编码解决了差异。

    在 apache 上,相同的代码会导致 Nönüß

    这意味着这里的解释方这次没有将字符串解释为 UTF-8,即使字符串是 UTF-8。我假设“Apache”是指“在浏览器中”。您需要通过 HTTP 标头或 HTML 元标记告诉您的浏览器它应该将文本解释为 UTF-8。

    我找到了自己的解决方案。

    $result = utf8_decode (iconv (LATIN1, 'UTF-8', N�n��;M�tt));
    

    猜猜utf8_decode 做了什么。它将字符串的编码从 UTF-8 转换为 Latin-1。所以上面的代码将 Latin-1 转换为 ... Latin-1。

    请阅读以下内容:

    【讨论】:

    • 好的,谢谢。在命令行上,utf8_decode 不是必需的,但为了在浏览器中正确显示,它是缺少的链接(N�n��;M�tt 是 iconv 步骤之前在浏览器中显示的内容,基于从 CSV 读取的数据用户上传的文件)。
    • 好吧,您只是编码不匹配。命令行似乎需要并显示 UTF-8,浏览器需要 Latin-1,因为你没有告诉它,CSV 似乎是 Latin-1 编码的。在读取 CSV 数据时将其转换为 UTF-8,然后将所有内容保存在 UTF-8 中。
    • 我还没有理解。命令行设置了区域设置“en_US.utf8”,您可以将 Windows/Macintosh/MsDOS/Latin 等编码的文本扔给它,它会将其全部转换为 UTF-8 并在命令行上显示正确的输出。 Web 界面也确实如此(区域设置也同样设置),但不会正确输出,除非首先通过 utf8_decode 运行输出。因此,似乎 iconv 正确转换为 UTF-8,但浏览器显示无法正确显示,除非通过 utf8_decode 运行结果。至少我是这么理解的。
    • 命令行永远不会自动转换任何东西。它只是解释它得到的任何东西,并以设置的编码显示它。浏览器也是如此。我建议您阅读我在上面链接的最后两篇文章,以了解编码。
    • 我没有这么说,但我写了一个脚本来检测编码并转换它。这就是我所说的“自动”。当然,命令行或浏览器不会对文本做任何事情,但我的脚本使用“iconv”执行编码转换。但我会看文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2012-07-19
    • 2012-10-29
    • 2011-05-20
    相关资源
    最近更新 更多