马黑黑 发表于 2026-1-3 13:07

测试生僻字的显示问题

<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>

马黑黑 发表于 2026-1-3 13:08

下面是复制粘贴的效果:

铗邯&#146887;剦飞&#191096;&#132410;&#135314;粐噗

马黑黑 发表于 2026-1-3 13:22

从二楼的粘贴效果可以看到,有 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 编码还原为汉字即可。

马黑黑 发表于 2026-1-3 13:23

<p>也可以将生僻字转成 html实体编码,就是二楼里哪些符号+数字的样式,例如下面这个字用了 html 实体编码,要以HTML代码的方式发布,就能正常显示:<br></p>
<p style="font-size: 30px;">&#191096;</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>

樵歌 发表于 2026-1-3 14:28

飞字不会吧。{:4_203:}

红影 发表于 2026-1-3 14:29

看到这些字,懵了,一个都不会啊{:4_173:}

红影 发表于 2026-1-3 14:33

马黑黑 发表于 2026-1-3 13:23
也可以将生僻字转成 html实体编码,就是二楼里哪些符号+数字的样式,例如下面这个字用了 html 实体编码,要 ...

这个又是黑黑自己做的工具吧,厉害了{:4_187:}

小辣椒 发表于 2026-1-3 14:49

马黑黑 发表于 2026-1-3 13:22
从二楼的粘贴效果可以看到,有 6 个字正常,它们是 Unicode 基本区汉字,论坛使用的数据库支持良好;其余的 ...

黑黑懂的真多{:4_178:}

杨帆 发表于 2026-1-3 17:16

哇,马老师对文字输入造诣很深,原来字符与 Unicode编码和html实体编码可以如此转换呢

马黑黑 发表于 2026-1-3 18:44

杨帆 发表于 2026-1-3 17:16
哇,马老师对文字输入造诣很深,原来字符与 Unicode编码和html实体编码可以如此转换呢

{:4_190:}

马黑黑 发表于 2026-1-3 18:44

小辣椒 发表于 2026-1-3 14:49
黑黑懂的真多

{:4_190:}

马黑黑 发表于 2026-1-3 18:45

红影 发表于 2026-1-3 14:33
这个又是黑黑自己做的工具吧,厉害了

转换工具是前年做的吧

马黑黑 发表于 2026-1-3 18:45

红影 发表于 2026-1-3 14:29
看到这些字,懵了,一个都不会啊

飞字也不会呀{:4_170:}

马黑黑 发表于 2026-1-3 18:46

樵歌 发表于 2026-1-3 14:28
飞字不会吧。

这是随机取字,兼顾了常用字

花飞飞 发表于 2026-1-3 20:04

马黑黑 发表于 2026-1-3 13:23
也可以将生僻字转成 html实体编码,就是二楼里哪些符号+数字的样式,例如下面这个字用了 html 实体编码,要 ...
真是神转换。。
喞喟喠喡喢喣喤喥喦喨喩喫

花飞飞 发表于 2026-1-3 20:05

{:4_173:}换成HTML字符后,就自动成字了。厉害了我的哥

马黑黑 发表于 2026-1-3 20:06

花飞飞 发表于 2026-1-3 20:04
真是神转换。。
喞喟喠喡喢喣喤喥喦喨喩喫

是的吧?若不转换,这里好多生僻字就是“乱码”(实际上是HTML实体编码)

马黑黑 发表于 2026-1-3 20:07

花飞飞 发表于 2026-1-3 20:05
换成HTML字符后,就自动成字了。厉害了我的哥
所谓 html 字符有一个专业术语:html 实体编码

花飞飞 发表于 2026-1-3 20:08

马黑黑 发表于 2026-1-3 20:06
是的吧?若不转换,这里好多生僻字就是“乱码”(实际上是HTML实体编码)

{:4_199:}乱码就是这 么来的,现在知道了。。运行不动就自然乱码。

花飞飞 发表于 2026-1-3 20:30

马黑黑 发表于 2026-1-3 20:07
所谓 html 字符有一个专业术语:html 实体编码

我看是由数字和字母组成的,而且可以重复,那就多少万都可以了。{:4_173:}
页: [1] 2 3
查看完整版本: 测试生僻字的显示问题