PHP如何解析无反斜杠的Unicode符号(如u0024转$)
解决PHP中Unicode转义序列缺失反斜杠无法解析的问题
这个问题的核心很明确:原本JSON里的标准Unicode转义序列是\u0024,但经过stripslashes()处理后,前面的反斜杠被移除,变成了u0024,而json_decode()只认带反斜杠的标准格式,自然没法把它解析成$字符。要让所有这类Unicode符号都能被正确识别,我们需要先把缺失的反斜杠补回去,再进行解码。
具体解决方案
我们可以用正则表达式匹配所有u开头的四位十六进制字符序列,给它们补上前面的反斜杠,转换成json_decode()能识别的标准格式:
// 模拟经过stripslashes()处理后的字符串 $processedStr = '{"description":"Hello World, I have u00249999999 dollars","website":"https://www.w3schools.com/php/default.asp"}'; // 补全Unicode转义序列的反斜杠 $fixedJson = preg_replace('/u([0-9a-fA-F]{4})/', '\u$1', $processedStr); // 解码处理后的JSON $decodedData = json_decode($fixedJson, true); // 输出结果 print_r($decodedData);
运行这段代码后,description字段就会正确显示为:Hello World, I have $9999999 dollars,同时网址的正斜杠也不会受到影响,完全符合你的需求。
为什么这个方法有效?
- 正则表达式
/u([0-9a-fA-F]{4})/会精准匹配所有u后面跟着四位十六进制字符的序列(覆盖所有Unicode基本平面的字符)。 - 替换为
\u$1后,就把非标准的uXXXX转换成了JSON规范要求的\uXXXX转义格式,json_decode()就能正常解析成对应的Unicode字符了。 - 这个规则适用于所有Unicode符号,比如
u00E6会被转换成\u00E6,最终解析成æ;u4F60会变成\u4F60,解析成中文的你。
注意事项
如果你的JSON字符串里存在正常的文本内容(比如某个字段值是u1234,并非Unicode转义序列),这个正则替换会误修改它。这种极端场景下,你可能需要结合JSON的结构做更精准的匹配,但绝大多数业务场景中,这个通用方案已经足够可靠。
内容的提问来源于stack exchange,提问作者Nathan Dsouza
相关产品推荐
相关产品推荐

