包含 '\U' 的unicode编码的字符串,无法转化为中文?

Crushdada
  • 141
let font= "\U65b9\U6b63\U5c0f";
let rightFont = "\u65b9\u6b63\u5c0f"

console.log("rightStr = ",rightFont);
// rightStr =  方正小

const formateStr=  font.replace(/\U/g,"\\u");
console.log("formateStr = ",formateStr);
// formateStr =  \u65b9\u6b63\u5c0f

问题

为什么我已经把U换成u了,还是无法显示中文?

探索

发现二者编码不一样

console.log(encodeURI(rightFont,"utf-8")); //%E6%96%B9%E6%AD%A3%E5%B0%8F
console.log(encodeURI(formateStr,"utf-8")); //%5Cu65b9%5Cu6b63%5Cu5c0f

这个问题只在mac端存在,我的dev环境是在electron读取系统的字体,改问题可能是Mac跨平台兼容字体的问题

Mac 用户在处理 Windows 下编辑的文档时,会遇到字体的兼容性问题,常见字体如仿宋GB_2312、方正小标宋、楷体_GB2312等,如果不安装经过特殊处理的字体,将无法正常识别。

https://github.com/guorenxi/M...

不清楚此类问题能否从技术角度来解决,而不是如上链接中所说的,需要用户重装对应字体...

回复
阅读 1.5k
3 个回答
'\U' === 'U' // true

\是转义符, 所以当你这样\U定义字面量的时候,js引擎在解析代码的时候已经丢掉了\ 当然不可能有正确的结果。

什么场景需要定义一个这样的字符串字面量呢,如果一定要这么搞,可以像这样:

let font= "\U65b9\U6b63\U5c0f";
str = font.split('U').filter(v=> v.length > 0).map(v => String.fromCharCode(parseInt(v, 16))).join('');
console.log(str) //方正小

=====补充========
如果你的字符串不是字面量,而是某个地方读出来的,自带了\字符,那么同样的道理:

let font= "\\U65b9\\U6b63\\U5c0f";
str = font.replace(/\\U([0-9a-z]{4})/g, (_, n) => String.fromCharCode(parseInt(n, 16)));
formateStr=  font.replace(/\U/g,"%u")
console.log("formateStr = ",unescape(formateStr));

decodeURI('\u65b9\u6b63\u5c0f')
unescape(('\U65b9\U6b63\U5c0f').replaceAll('\U', '%u'))

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏