测试生僻字的显示问题
<h2>以下文本是测试内容:</h2><div id="outputBox" style="font-size: 30px;"></div>
<script>
const zh2u = (zhChar) => {
let result = zhChar.charCodeAt(0).toString(16);
if (result.length < 4) result = result.padStart(4, '0');
return '\\u' + result;
};
const u2zh = (str) => String.fromCharCode(str);
const zhstr2u = (str) => {
const ar = str.split('');
let result = '';
for (let i = 0; i < ar.length; i ++) {
result += zh2u(ar[ i ]);
}
return result;
};
const ustr2zh = (str) => {
const ar = str.split('\\u');
return ar.join('');
};
const uchars = '\u94d7\u90af\ud84f\uddc7\u5266\u98de\ud87a\ude78\ud841\udd3a\ud844\udc92\u7c90\u5657';
outputBox.innerText = ustr2zh(uchars);
</script> 下面是复制粘贴的效果:
铗邯𣷇剦飞𮩸𠔺𡂒粐噗
从二楼的粘贴效果可以看到,有 6 个字正常,它们是 Unicode 基本区汉字,论坛使用的数据库支持良好;其余的字不能正常显示,因为它们是 Unicode 扩展区文字,数据库保存它们时自动转换了编码,发帖后还原不出原始形态。
但一楼又能正常显示所有的文字。为什么?因为,一楼使用了使用JS处理了编码问题:待发布的文本内容为纯 Unicode 编码,像下面这样:
\u94d7\u90af\ud84f\uddc7\u5266\u98de\ud87a\ude78\ud841\udd3a\ud844\udc92\u7c90\u5657
保存到数据库中的核心内容就是上一行,然后在打开帖子时JS在前台将其转换为汉字。
原理:Discuz!数据库对文字的支持有限,将生僻字(确切说是部分生僻汉字)转为 Unicode 编码得到的结果是字母和符号(\),这些是标准字符,数据库的存储完全没有问题;花朝论坛现在使用了 GBK 前台编码,故而可以显示Windows支持的所有汉字,使用JS将 Unicode 编码还原为汉字即可。 <p>也可以将生僻字转成 html实体编码,就是二楼里哪些符号+数字的样式,例如下面这个字用了 html 实体编码,要以HTML代码的方式发布,就能正常显示:<br></p>
<p style="font-size: 30px;">𮩸</p>
<p><br>我网站有一个字符转换的小工具:<a href="http://mhh.52qingyin.cn/art/show.php?st=5&sd=5&art=mahei_1706085226" target="_blank">http://mhh.52qingyin.cn/art/show.php?st=5&sd=5&art=mahei_1706085226</a></p> 飞字不会吧。{:4_203:} 看到这些字,懵了,一个都不会啊{:4_173:} 马黑黑 发表于 2026-1-3 13:23
也可以将生僻字转成 html实体编码,就是二楼里哪些符号+数字的样式,例如下面这个字用了 html 实体编码,要 ...
这个又是黑黑自己做的工具吧,厉害了{:4_187:} 马黑黑 发表于 2026-1-3 13:22
从二楼的粘贴效果可以看到,有 6 个字正常,它们是 Unicode 基本区汉字,论坛使用的数据库支持良好;其余的 ...
黑黑懂的真多{:4_178:} 哇,马老师对文字输入造诣很深,原来字符与 Unicode编码和html实体编码可以如此转换呢 杨帆 发表于 2026-1-3 17:16
哇,马老师对文字输入造诣很深,原来字符与 Unicode编码和html实体编码可以如此转换呢
{:4_190:} 小辣椒 发表于 2026-1-3 14:49
黑黑懂的真多
{:4_190:} 红影 发表于 2026-1-3 14:33
这个又是黑黑自己做的工具吧,厉害了
转换工具是前年做的吧 红影 发表于 2026-1-3 14:29
看到这些字,懵了,一个都不会啊
飞字也不会呀{:4_170:} 樵歌 发表于 2026-1-3 14:28
飞字不会吧。
这是随机取字,兼顾了常用字 马黑黑 发表于 2026-1-3 13:23
也可以将生僻字转成 html实体编码,就是二楼里哪些符号+数字的样式,例如下面这个字用了 html 实体编码,要 ...
真是神转换。。
喞喟喠喡喢喣喤喥喦喨喩喫 {:4_173:}换成HTML字符后,就自动成字了。厉害了我的哥 花飞飞 发表于 2026-1-3 20:04
真是神转换。。
喞喟喠喡喢喣喤喥喦喨喩喫
是的吧?若不转换,这里好多生僻字就是“乱码”(实际上是HTML实体编码) 花飞飞 发表于 2026-1-3 20:05
换成HTML字符后,就自动成字了。厉害了我的哥
所谓 html 字符有一个专业术语:html 实体编码 马黑黑 发表于 2026-1-3 20:06
是的吧?若不转换,这里好多生僻字就是“乱码”(实际上是HTML实体编码)
{:4_199:}乱码就是这 么来的,现在知道了。。运行不动就自然乱码。 马黑黑 发表于 2026-1-3 20:07
所谓 html 字符有一个专业术语:html 实体编码
我看是由数字和字母组成的,而且可以重复,那就多少万都可以了。{:4_173:}