Php 如何将这种奇怪的字符串解码为UTF-8?(菲律宾)

Php 如何将这种奇怪的字符串解码为UTF-8?(菲律宾),php,utf-8,encode,decode,Php,Utf 8,Encode,Decode,因此,我有%u041E%u043B%u0435%u0433%20%u042F%u043A如何将其保存到真正的UTF-8或(对HTML实体更好)?

因此,我有
%u041E%u043B%u0435%u0433%20%u042F%u043A
如何将其保存到真正的UTF-8或(对HTML实体更好)?

$string = html_entity_decode($string,ENT_COMPAT,"UTF-8")

这是JavaScript
escape()
格式。它类似于URL编码,但不兼容。使用它通常是一个错误

最好的做法是更改生成它的脚本,改为使用正确的URL编码(
encodeURIComponent()
)。然后,您可以使用
urldecode
或服务器端的任何其他正常URL解码功能对其进行解码

如果您必须以这种非标准格式交换数据,则必须为其编写自定义解码器。下面是一个利用HTML字符参考解码器的快速破解:

function jsunescape($s) {
    $s= preg_replace('/%u(....)/', '&#x$1;', $s);
    $s= preg_replace('/%(..)/', '&#x$1;', $s);
    return html_entity_decode($s, ENT_COMPAT, 'utf-8');
}
这将返回原始UTF-8字节字符串。如果您真的希望它出现在HTML字符引用中,比如
Ру...
然后停止
html\u entity\u decode
调用。但通常你不会。最好保持字符串为原始格式,直到需要转义以进行最终输出 — 最好不要用字符引用替换非ASCII字符,除非您真的需要

如果像这样的字符串出现在我眼前“%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED”

这是URL表单编码,与
escape()
格式不直接兼容。虽然URL编码的2位字节转义不同于疯狂的
转义
-格式的4位代码单元转义,但字符
+
是不明确的。它可能意味着一个加号(如果字符串来自
escape
),或者一个空格(如果它来自浏览器表单提交)。没有办法分辨它是哪一个。这是不使用
escape()
的另一个原因

除此之外,;如果此字符串的字符集是UTF-8,则可以使用上述函数,将URL编码的字节和疯狂的
escape()
-格式的Unicode字符转换为原始UTF-8字节

然而,它实际上似乎是代码页1251(Windows俄语)。是否确实要在cp1251中处理所有字符串?如果是这样的话,您必须对其进行一些更改,使其将四位转义码编码为不同的字符集。这很混乱:

function url_or_maybe_jsescape_decode($s, $charset, $isform) {
    if ($isform)
        $s= str_replace('+', ' ', $s);
    $s= preg_replace('/%u(....)/', '&#x$1;', $s);
    $s= preg_replace('/%(..)/', '&!#x$1;', $s);
    $s= html_entity_decode($s, ENT_COMPAT, $charset);
    $s= str_replace('&!', '&', $s);
    $s= html_entity_decode($s, ENT_COMPAT, 'utf-8');
    return $s;
}

echo url_or_maybe_jsescape_decode('%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED', 'cp1251', TRUE);
我强烈建议:

  • 修复闪存文件,使其使用正确的
    encodeURIComponent
    而不是
    escape
    ,这样您就可以使用标准的URL解码器而不是这种丑陋的破解

  • 在应用程序中始终使用UTF-8,这样您就可以支持俄语以外的其他语言,并且不必担心提交表单的输入编码会发生变化


  • (所有不是UTF-8的编码都很糟糕,这是科学证明的事实!)

    正如其他人所建议的,将其转换为Unicode HTML实体。这是我使用的正则表达式

    function escapePercentU($s) {
       $s = preg_replace( "/%u([A-Fa-f0-9]{4})/", "&#x$1;", $s);
       return html_entity_decode($s, ENT_COMPAT, 'utf-8');
    }
    

    Flash“escape(string)”函数生成的字符串是否适用于C#或任何其他语言编码的字符串?不适用。。。它甚至不会将奇怪的flash字符串更改为UTF8=(ENT_COMPAT是第二个参数的默认值,我将其输入到UTF-8的第三个参数中,它现在对我来说运行良好(当我使用flash时)但是如果像这样的字符串出现在我的脑海里会怎样呢“%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED”你的函数会对它造成任何伤害吗?我的意思是,当它在浏览器中显示时,它会看起来像ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ和正确的URL编码。如果可以,我将+5,并建议重新措辞问题标题,以便子孙后代可以从中获益。