你是不是也遇到过这样的情况:从网页抓了一段文字,或者读取了一个 JSON 文件,结果控制台里显示一堆类似 \u4f60\u597d 的东西?复制到编辑器里一看,全是方块或问号——这不是 bug,是 Unicode 编码没正确转成可读的中文。
Unicode 转字符串,到底在转什么?
简单说,\u4f60 是 Unicode 码点的转义写法,对应汉字“你”。它不是乱码,只是还没“解码”成我们看得懂的样子。就像快递单号要扫码才能查物流,Unicode 转义序列也要经过处理,才能变成真实字符。
常见场景,随手就能试
比如你在浏览器控制台看到:
"\u4f60\u597d\uff0c\u4eca\u5929\u5403\u4e86\u4ec0\u4e48\uff1f"这其实是:“你好,今天吃了什么?”——但得让它“活”过来。Python 里最省事的方法
直接用 .encode().decode('unicode_escape'):
s = "\\u4f60\\u597d\\uff0c\\u4eca\\u5929\\u5403\\u4e86\\u4ec0\\u4e48\\uff1f"
result = s.encode().decode('unicode_escape')
print(result) # 输出:你好,今天吃了什么?注意:如果原始字符串里反斜杠是单个(比如从文件或 API 直接读出来的),就不用额外加双反斜杠,直接 s.decode('unicode_escape') 即可。
JavaScript 怎么办?
浏览器环境可以直接用 JSON.parse 偷个懒(前提是格式合规):
const str = '"\\u4f60\\u597d\\uff0c\\u4eca\\u5929\\u5403\\u4e86\\u4ec0\\u4e48\\uff1f"';
const decoded = JSON.parse(str);
console.log(decoded); // 你好,今天吃了什么?或者更通用的写法:
function unicodeToChar(str) {
return str.replace(/\\u[\da-fA-F]{4}/g, function(match) {
return String.fromCharCode(parseInt(match.slice(2), 16));
});
}
unicodeToChar('\\u4f60\\u597d'); // '你好'顺手避个坑
有时候你看到的是 \U0001F600(带大写 U 和 8 位数字),这是 Unicode 补充平面字符,比如 😄。Python 里要用 surrogatepass 或直接用 encode('utf-16', 'surrogatepass').decode('utf-16', 'surrogatepass'),但多数日常情况用不到——普通表情和中文,四位 \u 就够了。
下次再看到一串 \u 开头的字符,别急着截图发群问“这是啥”,打开编辑器敲两行,秒变人话。