【问题标题】:Javascript encodeURI() vs. PHP rawurldecode() and special charactersJavascript encodeURI() 与 PHP rawurldecode() 和特殊字符
【发布时间】:2015-07-19 13:45:36
【问题描述】:

使用 Javascript encodeURI() 用 ä,ü,ö,ß 等德语变音符号对字符串进行编码会在 PHP 中使用 rawurldecode() 对其进行解码后导致一个奇怪的错误。尽管该字符串似乎已正确解码,但并非如此。请参阅下面来自我的 IDE 的示例屏幕截图

还有 strlen() 的 - with rawurldecode() - 解码后的字符串提供的字符比它实际拥有的要多!

当我需要处理解码后的字符串时会出现问题,例如,如果我想将德语字符 ä,ü,ö 替换为 ae、ue 和 oe。这可以在here 提供的示例中看到。

我还创建了一个PHP fiddle,可以看到整个奇怪之处。

到目前为止我已经尝试过: - utf8_decode - 图标 - 还有来自here 的前两条建议

【问题讨论】:

    标签: javascript php url urlencode url-encoding


    【解决方案1】:

    这是一个Unicode equivalence 问题,看起来您的 IDE 不能很好地处理多字节字符串。

    在 unicode 中,您可以使用以下任一方式表示 Ü:

    • utf8 中的单个 unicode 代码点 (U+00DC) 或 %C3%9C
    • 或在 utf8 中使用带有修饰符 (U+0308) 或 %55%CC%88 的大写字母 U (U+0055)

    您的 GWT 字符串使用称为 NFD 的后一种方法,而您的 PHP 字符串使用称为 NFC 的第一种方法。这就是为什么您的 GWT 字符串长 3 个字符的原因,即使它们都是逻辑上相同的 unicode 字符串的有效编码。您的问题是它们在 PHP 中的每个字节都不相同。

    更多关于utf-8 normalisation的细节。

    如果您想对字符串进行 preg 替换,您需要先将它们标准化为相同的形式。从您的示例中,我可以看到您的 IDE 正在使用 NFC,因为它是有效的 PHP 字符串。所以我建议在 PHP 中规范化为 NFC 形式(默认),然后执行 preg_replace。

    http://php.net/manual/en/normalizer.normalize.php

    function cleanImageName($name)
    {
        $name = Normalizer::normalize( $name, Normalizer::FORM_C );
            $clean = preg_replace(
    

    否则你必须做一些基于this articlelike this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多