【问题标题】:PHP UTF-8 mb_convert_encode and Internet-ExplorerPHP UTF-8 mb_convert_encode 和 Internet-Explorer
【发布时间】:2015-07-15 12:56:26
【问题描述】:

自从我阅读了有关字符编码的文章以来,我想使用 UTF-8 制作我的所有页面以实现兼容性。但是当我尝试将用户输入转换为 UTF-8 时,我遇到了困难,这适用于所有浏览器,期待 Internet-Explorer(像往常一样)。

我不知道我的代码有什么问题,我觉得很好。

  • 我用字符编码设置了标题
  • 我将文件保存为 UTF-8(无 BOM)

只有当您尝试通过 Internet-Explorer myscript.php?c=äüöß 上的 $_GET 访问页面时才会发生这种情况 当我在我的网站上写下特殊字符时,它们会正确显示。

这是我的代码:

// User Input
$_GET['c'] = "äüöß"; // Access URL ?c=äüöß
//--------
header("Content-Type: text/html; charset=utf-8");
mb_internal_encoding('UTF-8');

$_GET = userToUtf8($_GET);

function userToUtf8($string) {
    if(is_array($string)) {
        $tmp = array();
        foreach($string as $key => $value) {
            $tmp[$key] = userToUtf8($value);
        }
        return $tmp;
    }

    return userDataUtf8($string);
}

function userDataUtf8($string) {
    print("1: " . mb_detect_encoding($string) . "<br>"); // Shows: 1: UTF-8
    $string = mb_convert_encoding($string, 'UTF-8', mb_detect_encoding($string)); // Convert non UTF-8 String to UTF-8
    print("2: " . mb_detect_encoding($string) . "<br>"); // Shows: 2: ASCII
    $string = preg_replace('/[\xF0-\xF7].../s', '', $string);
    print("3: " . mb_detect_encoding($string) . "<br>"); // Shows: 3: ASCII

    return $string;
}
echo $_GET['c']; // Shows nothing
echo mb_detect_encoding($_GET['c']); // ASCII
echo "äöü+#"; // Shows "äöü+#"

最令人困惑的部分是,它向我展示了从 UTF-8 转换为 ASCII... 有人能告诉我为什么它没有正确显示特殊字符,这里有什么问题吗?或者这是 Internet-Explorer 上的错误?

编辑: 如果我禁用转换它说,这都是 UTF-8 但字符也不会显示给我......它们显示为“??????”......

注意:这只发生在 Internet-Explorer 中!

【问题讨论】:

  • 你用的是什么版本的IE?您通过 GET 检索的三个字符是您需要转换的字符,对吧?
  • 没错。我使用版本 IE 11.0.9600。但我希望它可以像在其他浏览器中一样与所有 UTF-8 字符一起使用
  • 把IE的编码改成utf8能正常显示吗?
  • 这是整个 PHP 文件吗?对于 HTML 内容,您需要将其放在 &lt;html&gt; 标记中。对于非 UTF8 浏览器 (IE),您需要在 &lt;meta charset&gt; 中指定文档的字符集。
  • 看来如果c是urlencodedc=%C3%A4%C3%BC%C3%B6%C3%9F就可以了。

标签: php internet-explorer encoding utf-8


【解决方案1】:

虽然我更喜欢在地址栏中使用 urlencoded 字符串,但对于您的情况,您可以尝试将 $_GET['c'] 编码为 utf8。例如。

$_GET['c'] = utf8_encode($_GET['c']);

【讨论】:

    【解决方案2】:

    一种使用 IE 11.0.18 显示字符的方法:

    • 检索角色的Unicode:例如'ü' = 'U+00FC'

    • 根据this post,转换为utf8实体

    • 在转储前使用 utf8_decode 对其进行解码

    用 'ü' 字符说明示例的代码行是:

    var_dump(utf8_decode(html_entity_decode(preg_replace("/U\+([0-9A-F]{4})/", "&#x\\1;", 'U+00FC'), ENT_NOQUOTES, 'UTF-8')));
    

    总结:为了显示目的,从 Unicode 转为 UTF8,然后在显示之前对其进行解码。

    其他资源: a post to retrieve characters' unicode

    【讨论】:

    • utf_decode() 生成一个 ISO-8859-1 字符串。将它返回到 ISO-8859-1 字符串对我来说似乎很奇怪。它认为 UTF8 的意义在于避免这样的解决方法,无论用户来自哪里,都可以显示它。这是唯一的解决方案吗?
    • 如果我不调用 utf8_decode,我会得到 'ü',它比我得到的 ISO 字符串可读性差:S 试图提供帮助
    • 是的,谢谢你^^ 但我希望有一个像这样更干净的解决方案。因为如果我使用那个 ISO 字符串,为什么我会在使用 UTF-8 时遇到麻烦,我希望你能理解 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2012-08-27
    • 1970-01-01
    • 2012-02-07
    • 2010-11-10
    • 2011-03-24
    • 2023-03-22
    相关资源
    最近更新 更多