Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端生僻字显示

前端生僻字显示

作者头像
异名
发布于 2020-08-10 02:17:51
发布于 2020-08-10 02:17:51
3.1K0
举报
文章被收录于专栏:异名异名

异名在一个游戏项目中遇到一个比较有意思的问题,在游戏的玩法设定中,当怪物在消失的时候会爆出一个中文字,这个效果在部分机型上会出现乱码符号

显示乱码的原因

一开始还以为是字符太多了,char的纹理不够用了,还尝试过手动调用游戏引擎cc.Label.clearCharCache去清除;后来才认识到是生僻字的问题,这得从字符编码说起,Unicode为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,其中:

3400~4dffh:是中日韩认同表意文字扩充a区,总计收容6,582个中日韩汉字 4e00~9fffh:是中日韩认同表意文字区,总计收容20,902个中日韩汉字 ❞

通常情况下,我们日常所用到的中日韩非符号字符都会落在3400-9fff这个编码区间,因此当我们需要判断某一个字符是否是属于汉字的时候,就可以通过查看它的的Unicode编码是否落在这个区间,我们写一个正则去检查一下上面两个字符?:

可以看到第二个字它并不处于常用汉字的编码区间,它是生僻字,生僻字的使用频率很低,我们日常高频用的的汉字其实也就是几千个而已。字体公司设计汉字字体的成本比较高,因为如果要设计一款英文字体,那就只要设计26个字母就可以组合出所有的单词了,而每一个汉字则几乎都需要人工去做造型,生僻字的造字性价比可见有多低,可以说每一款汉字字体都是收录残缺,缺多缺少而已。所以这就解析了为啥在华为的手机上为啥看到的是乱码而在苹果手机上却能正常显示该字符,因为他们的系统字体库不同,华为的字体库没有录用这个生僻字

解决方法

在前端要解决生僻字的显示问题可以利用css的font-family 的字体备选机制,可以把这个生僻字单独做成一个字体文件,然后通过@font-face 嵌入,然后在需要的地方引用,浏览器在解析文字的时候会逐字匹配,当字体上没有这个字符的时候就会在备用的字体上选择,从而能够让我们的生僻字被显示出来,一般生成单字体文件有这几种方式:

字体切割

如果你缺失的还不算太生僻,可能在某些字体库中收录了这个字,那就可以通过字蛛或者fontmin这些字体提取方案把这个字单独提取出来,作为单字体文件引用

icon font

让设计师单独针对这个生僻字做设计然后生成icon font,可以直接上传阿里的iconfont,然后再下载代码,默认会给到UnicodeFont classSymbol三种引用方式

专用的字体信息网站

有一个日本的字体信息网站glyphwiki.org,支持检索,甚至可以通过偏旁部首拼凑生僻字,也非常方便

位图字体

当然在游戏中,更常见的方式是使用位图字体,位图字体由 fnt 格式的字体文件和一张png图片组成,fnt文件提供了对每一个字符小图的索引,这种格式的字体可以由专门的软件生成,异名用的是shoebox。因为位图字体是一个符号和图片的索引文件,所以我们可以把某个场景下具有特色的字体都单独做设计,当然也可以应用在生僻字的显示中:

这个也是异名最终使用的方案,你永远不知道你的下一个游戏背景设定是什么,万一是山海经里面的远古神兽或者是像异名这种学科游戏里面的奇葩新造字,或者能够给大家带来一点参考。

不可靠的String.length

以上就把需求解决完了,但是异名在踩坑的过程中还发现一个有趣的事情:

字符串的length属性是多么的不可靠!而且更有意思的是,String.length的长度不是2吗,但是如果你用不同的方式去遍历,你还会发现一些更神奇的事情:

异名看到这个执行结果的时候是挺惊讶,而且这个怪异表现可能还会和我们的日常工作产生交集。相对于汉字,我们更经常遇到的问题可能是emoji,比如某天产品经理有个需求,用户的姓名输入框要做一个长度限制,长度不能超过十,你说简单啊,利用length做一下校验,长度超过十的就拦截了。然后测试同学,啪啪啪输入五个?...

这个需求相信大部分前端都有遇到过,用length去判断是不可靠的,为什么呢?因为在字符编码上,有好几种方式可以用来表达字符:

?可以是一个字符,但是也可以用两个字符来表达,所以你就不能奢望String.length能给到你一个可靠的结果了。这个时候我们回头看一眼MDN上对String.length的描述,你就会发现人家一开始就说了,我不可靠...

那有没有一种可靠的方法能够准确统计字符串的长度呢,我上面举了Array.from的例子,它正确返回了字符的长度,但是它也只是一个有缺陷的方案,它对某些字符有效

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 异名 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
𬎆 这个字你能看到算我输,看MogDB如何拿捏生僻字
最近在云和恩墨大讲堂的微信群里,有朋友讨论生僻字的存储,其实无论任何数据库,MogDB 还是 Oracle ,在任何数据库中存储生僻字,其实都和一个因素有关:字符集。
数据和云
2021/10/15
2.2K0
MogDB 对于生僻字的存储和显示:㼆 㱔 䶮 (王莹)
最近在云和恩墨大讲堂的微信群里,有朋友讨论生僻字的存储,其实无论任何数据库,MogDB 还是 Oracle ,在任何数据库中存储生僻字,其实都和一个因素有关:字符集。
数据和云01
2021/12/06
1.1K0
MogDB 对于生僻字的存储和显示:㼆 㱔 䶮 (王莹)
刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK
英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够了(2^8 = 256)。但其他一些文字不止这么多字符,比如中文中的汉字就多达10多万个,一个字节只能表示256个字符,肯定是不够的,因此只能使用多个字节来表示一个字符。
笨笨阿林
2022/05/09
4.7K0
刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK
一个流传广泛的正则匹配所有中文的错误表示
小鹏 and (小灵狗 or 神州租车) and (三方战略 or 宁波 or P7 or 租赁 or 广州 or 杭州 or 王桐 or 蒋志春 or 残值管理 or 曾䶮冬 or 强强联合 or 战略合作 or 共赢)
明月AI
2023/02/06
1.7K0
「biáng biáng 面」马上可以打出来了!Unicode发布13.0版本,收录4939个生僻字
然而,最近Unicode(统一码、万国码、单一码)宣布要发布13.0版本,划重点:
量子位
2020/03/17
1.6K0
当流行遇到传统,当红包遇到生僻字
前言 文字是文化的载体,而汉字则是中华文化深刻又强大的基因。从仓颉造字到甲骨小篆,汉字文化千姿百态又源远流长。现代常用汉字不过寥寥,而那些快被遗忘了的生僻字却蕴藏着更加深远的文化。去年,一首《生僻字》红遍网络,当流行遇到传统,当红包遇到生僻字,我们尝试激发出生僻字新的活力,提供给用户新玩法新体验。 项目背景 生僻字红包玩法是基于QQ红包进行的一次特色互动玩法探索,以回答生僻字读音参与抢红包的方式进行社交互动。项目组尝试通过以下五个部分进行研究:用户研究(红包动机和社交行为研究)、确定目标和发力点、
腾讯ISUX
2021/07/14
6950
Python 玩转《生僻字》
这首《生僻字》,考验的是“语文”硬实力。倘若实力不够,其实可以拿Python来凑,毕竟库多!今天就来说一个有意思的pypinyin库,名字很直白,是Python版的拼音库,用来将汉字转为拼音。
TTTEED
2020/07/09
8900
YashanDB 知识库|GBK 库插入生僻字乱码?别忽视编码转换这一环
在 GBK 编码的 YashanDB 数据库中,尝试将包含生僻字的人名插入到 nvarchar2 字段时,出现了乱码或字符丢失的现象。例如以下操作:
数据库砖家
2025/05/12
860
MySQL生僻字改造项目排坑大法
中信银行的某个大佬在一个会议中提及中信银行将成为中国第一个在技术上支持生僻字的商业银行。由于历史原因,我们的MySQL部署规范提供的字符集为utf8字符集,需要将数据库的字符集集体转换为utf8mb4。
雨夜v1
2021/07/18
2.3K1
MySQL生僻字改造项目排坑大法
19·灵魂前端工程师养成-JavaScript数据类型和运算符
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1K0
19·灵魂前端工程师养成-JavaScript数据类型和运算符
从 JS 里的 MD5 转换踩坑开始说起
写 JS 代码的同学们不知道有没有注意过,后台接口通过 JSON 处理汉字字符、emoji 时,返回的是像 \u00ff 这样转义处理的字符,而不是它们的明文原文。这是为什么呢?
贤羽
2022/06/09
2.8K2
代码的注释又变成“锟斤拷”了?都是字符集惹的祸!
人类世界有海量的文字,这些文字可以被刻在石头上,墙壁上,竹筒上。这一个个符号都是字符。而我们把字符组成的集合就叫做字符集。
程序员牛肉
2024/09/26
3740
代码的注释又变成“锟斤拷”了?都是字符集惹的祸!
Oracle存储生僻字乱码问题
1、若Oracle数据库字符集为ZHS16GBK,则必须同时满足如下2个条件,才能避免生僻字乱码:
AiDBA宝典
2023/04/27
3.2K0
Oracle存储生僻字乱码问题
【说站】python中文生僻字的识别
本来考虑用正则来判断中文,因为网上发现正则的匹配中文是[\u4e00-\u9fa5]。接着代码都快写完了,发现有些生僻字不再在这个范围内。
很酷的站长
2022/11/24
8930
【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?
商品评价列表页,显示每条用户的评价详情,为了保护用户隐私,要求显示用户昵称时只能显示第一位和最后一位,其他的用※代替。
一枝花算不算浪漫
2020/10/09
9120
【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?
张龙netty学习笔记 P45 P46 字符集编码
什么是字符集 字符集分为编码和解码两个操作(decode和encode)。 decode将字节转化为字符,是对字节的一种解释方式。 encode将字符转化为字节,是对字符的一种编码。 各种字符集 ASCII 7个字节表示一个字符。会有位缺失(一个字节里最后一个字节没有用)。能表示英文字母、换行符等常用符号 iso-8859-1 8个字节表示一个字符,表示范围包含了ASCII 中文 中华人民共和国为了应对iso-8859-1无法表示数量繁多的汉字而制定的编码规则。用两个字节表示一个字符。
平凡的学生族
2019/05/25
6060
【YashanDB 知识库】GBK 库,生僻字插入 nvarchar2 字段后乱码问题
gbk 生僻字,客户端转换数据为 gbk 编码时,生僻字转换失败,发送给服务端存储的数据缺失,导致显示问题。
用户11441800
2025/02/25
1780
嵌入式的汉字原来是这样显示的?
摘要:LCD是嵌入式常见设备,如何在LCD上显示汉字和英文?矢量字体和点阵字体有何不同?同一个字符为何有多种编码?GB2312、GB18030指什么?他们之间有关系吗?嵌入式设备如何支持多国语言?从哪里获取字库?需要付费吗?以上问题,本文一一道来!
AI 电堂
2021/10/09
1.4K0
VBA:正则表达式(5) -提取中文内容
CJK(CJK Unified Ideographs,中日韩统一表意文字)字符集中了从0x4E00到0x9FA5的连续区域,包含了 20902 个来自于中国、韩国、日本的汉字,涵盖了多数中文字符,可以说CJK是GB2312-80和BIG5等字符集的超集。
Exploring
2023/09/25
1.5K0
VBA:正则表达式(5) -提取中文内容
使用Python检测符号及乱码字符
最近在进行关键词的分析,中间涉及到对一些特殊的字符进行过滤的需求。包括带符号的(有部分还是SQL注入),并且存在一部分乱码的问题。梳理下来供后续使用。
全栈程序员站长
2022/08/22
2.2K0
推荐阅读
相关推荐
𬎆 这个字你能看到算我输,看MogDB如何拿捏生僻字
更多 >
LV.0
深圳市梅沙科技有限公司前端开发工程师
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档