Javascript encodeURI()与PHP rawurldecode()和特殊字符

时间:2015-05-08 15:17:26

标签: javascript php url urlencode url-encoding

使用Javascript encodeURI()对带有德语变音符号(如ä,ü,ö,ß)的字符串进行编码会导致在使用 rawurldecode()在PHP中解码后出现奇怪的错误。虽然字符串似乎被正确解码但事实并非如此。请参阅以下示例来自我的IDE的屏幕截图

enter image description here enter image description here enter image description here

使用rawurldecode()的 strlen() - 解码后的字符串会提供比实际更多的字符!

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

我也做了一个PHP fiddle,可以看到这整个奇怪。

到目前为止我尝试过的事情: - utf8_decode - iconv - 以及来自here

的前两条建议

1 个答案:

答案 0 :(得分:0)

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

在unicode中,您可以使用以下任一代表Ü:

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

您的GWT字符串使用后一种称为NFD的方法,而您的一种方法则使用第一种称为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(

否则,您必须执行基于like this的<{3}}。