所以我有%u041E%u043B%u0435%u0433%20%u042F%u043A
如何将它保存为真正的 UTF-8 或(对我来说更好的 HTML 实体)?
3 回答
那是JavaScriptescape()
格式。它类似于 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_entity_decode
调用。但通常你不会。最好将字符串保持为原始格式,直到需要对它们进行转义以进行最终输出——最好不要用字符引用替换非 ASCII 字符,除非你真的需要。
如果像这样的字符串会出现在我的身边'%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED'
那是 URL-form-encoded,它与escape()
格式不直接兼容。虽然 URL 编码的 2 位字节转义不同于疯狂escape
格式的 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);
我强烈推荐:
修复 Flash 文件,使其使用正确的
encodeURIComponent
而不是escape
.在您的应用程序中一直使用 UTF-8,因此您可以支持俄语以外的语言,并且您不必担心提交表单的输入编码会发生变化。
(所有不是 UTF-8 的编码都很糟糕,这是科学证明的事实!)
PHP有解码功能
$string = html_entity_decode($string,ENT_COMPAT,"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');
}