SMF论坛编辑后出现%u格式字符,如何解码为正常文本?
字符格式类型及解码方法
格式说明
你遇到的%u0398%u03B1这类是JavaScript风格的Unicode转义序列,它以%u为前缀,后跟四位十六进制数,对应Unicode字符的码点。这种格式属于早期JS环境中使用的字符转义方式,和标准URL编码(%xx两位十六进制)逻辑类似,但前缀和长度不同。
PHP解码方法
PHP原生函数不直接支持%u格式解码,可通过转换为JSON兼容的\u转义格式实现解码:
$encodedText = '%u0398%u03B1 %u03C4%u03C1%u03B5%u03BE%u03C9 %u03B5%u03C3%u03C4%u03C9 %u03BA%u03B1%u03B9 %u03BC%u03B5 %u03B5%u03BD%u03B1 %u03C0%u03BF%u03B4%u03B1'; // 将%u替换为\u,包装成JSON字符串格式 $jsonEncoded = '"' . str_replace('%u', '\u', $encodedText) . '"'; $decodedText = json_decode($jsonEncoded); // 输出解码后的希腊语文本:Τα τρεω εσω και με ενα ποδα echo $decodedText;
JavaScript解码方法
有两种可靠的解码方式:
方法1:利用JSON.parse(推荐)
const encodedText = '%u0398%u03B1 %u03C4%u03C1%u03B5%u03BE%u03C9 %u03B5%u03C3%u03C4%u03C9 %u03BA%u03B1%u03B9 %u03BC%u03B5 %u03B5%u03BD%u03B1 %u03C0%u03BF%u03B4%u03B1'; const decodedText = JSON.parse('"' + encodedText.replace(/%u/g, '\\u') + '"'); console.log(decodedText); // 输出:Τα τρεω εσω και με ενα ποδα
方法2:正则匹配转换
const encodedText = '%u0398%u03B1 %u03C4%u03C1%u03B5%u03BE%u03C9 %u03B5%u03C3%u03C4%u03C9 %u03BA%u03B1%u03B9 %u03BC%u03B5 %u03B5%u03BD%u03B1 %u03C0%u03BF%u03B4%u03B1'; const decodedText = encodedText.replace(/%u([0-9A-Fa-f]{4})/g, (_, hex) => { return String.fromCharCode(parseInt(hex, 16)); }); console.log(decodedText); // 输出相同结果
内容的提问来源于stack exchange,提问作者Universe
相关产品推荐
相关产品推荐

