【问题标题】:Why does PHP's urlencode use different URL encoding?为什么 PHP 的 urlencode 使用不同的 URL 编码?
【发布时间】:2012-10-06 16:25:25
【问题描述】:

η 的 URL 编码为%CE%B7。但是在 PHP 中,当我写 echo urldecode("%ce%b7");

时,我得到了一些奇怪的符号

相反,如果我写echo urlencode("η");,那么我会得到%26%23951%3B。为什么我不能使用%CE%B7

解决方案

问题是我们使用了typo3。它有些如何不使用 unicode 进行内部处理。一旦我们在typo3 中设置$TYPO3_CONF_VARS['BE']['forceCharset'] = 'utf-8';echo urldecode("%ce%b7"); 的输出就是正确的。

关于为什么echo urlencode("η"); 给我%26%23951%3B,请参阅 Joni 的答案。

【问题讨论】:

    标签: php unicode typo3 urlencode


    【解决方案1】:

    urldecode("%ce%b7") 产生 η以 UTF-8 编码。如果您正在使用其他编码查看输出,您可能会看到其他内容。

    另一方面,当你解码%26%23951%3B时,你确实没有得到η;您将获得η,这是 η 的 HTML 实体代码。要解码实体代码,请使用html_entity_decode:

    echo html_entity_decode('η', false, 'UTF-8'); // prints η, encoded in UTF-8
    

    【讨论】:

    • 不幸的是,echo html_entity_decode('η', false, 'UTF-8'); 不打印 η。我已经包含了header('Content-Type: text/html; charset=utf-8');。浏览器假装以 unicode 显示它。实际上,echo urldecode("%26%23951%3B"); 打印 η。
    • 实际上,echo urldecode("%26%23951%3B") 打印出η。如果您碰巧在 Web 浏览器中查看结果,浏览器会将此多个字符序列显示为 η。至于为什么浏览器拒绝显示正确编码的 UTF-8 字符,尽管有 Content-Type 标头,不看页面很难说。
    • 好的,现在我看到了我的问题。感谢您指出了这一点。但是我还是不明白为什么echo urldecode("%ce%b7");没有正确显示。
    • 不看页面很难说。也许有一些非 UTF-8 的文本让浏览器认为页面没有以 UTF-8 编码?
    • 我得到了解决方案;往上看。感谢您的帮助。
    【解决方案2】:

    你可以试试下面的

    header('Content-Type: text/html; charset=utf-8');
    echo urldecode("%ce%b7"); // output : η
    

    See Live Demo

    【讨论】:

      猜你喜欢
      • 2013-03-12
      • 2013-01-21
      • 2011-06-07
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      相关资源
      最近更新 更多