在PHP上正确解码双编码UTF-8


Correctly decoding double-encoded UTF-8 on PHP

所以我试图通过Ajax将数据从HTML页面发送到PHP页面。

这是我使用的jQuery代码:

$.ajax({
    url: "test.php",
    type: "POST",
    data: {
        name: "João"
    }
}).done(function (data) {
    alert(data);
})

正如您所看到的,im sending的参数是"João"。在发出Ajax请求之前,jQuery在后台对其进行编码,"João"变为"Jo%C3%A3o",它是双重编码的UTF-8。

当请求被发送并且PHP试图在后台对其进行解码时,我的问题就出现了PHP在我使用$_POST时只自动解码一次,所以我得到的不是"João",而是"Joâ£o"之所以会发生这种情况,是因为PHP正在单独解码每%,因此%C3变成É%A3

如果我尝试通过utf8_decode()手动解码它,它会起作用,但我在这里想知道是否有更好的解决方案。我真正需要的是PHP能够正确解码我的数据,即使它是双重编码的,甚至是三重编码的。

这不是双重编码,而是正确的UTF-8。看起来PHP期望的是latin-1编码,并向您展示了如果它们不是,那么相同的字节意味着什么UTF-8.

在这种情况下,由于您的字符似乎低于0xFF,如果您不知道如何让PHP识别UTF-8,您也可以先将它们URL编码为latin-1中的Jo%E3o。