首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于DOAS文件系统接口(DFS)暴露的SPDK块设备
git clone https://github.com/spdk/spdk.git
晓兵
2023/05/22
8840
基于DOAS文件系统接口(DFS)暴露的SPDK块设备
NVMe-oF,nvme_cli_initiator与tgt(spdk_tgt)之Fabrics(RDMA)流程源码分析
NVMe over Fabrics (NVMe-oF) 是 NVMe 网络协议对以太网和光纤通道的扩展,可在存储和服务器之间提供更快、更高效的连接,并降低应用程序主机服务器的 CPU 利用率
晓兵
2023/07/14
2.5K0
NVMe-oF,nvme_cli_initiator与tgt(spdk_tgt)之Fabrics(RDMA)流程源码分析
用SPDK实现存储加速
个人理解nvme能提高存储性能,就像4G比3G快一样,电磁波还是光速,但协议变了,所以快了。rdma应用跑在用户态能减小存储时延,spdk在用户态实现nvme驱动,天然能和rdma结合,而且两者的队列能一一映射,能达到锦上添花的效果。坏处就是kernel upstream实现的nvme代码无法复用,网卡硬件得支持rdma,rdma的库很多,出了问题估计会有找不得北的感觉。
惠伟
2021/08/26
2.6K0
【重识云原生】第三章云存储3.2节——SPDK方案综述
SSD正在迅速扩展它在数据中心中的份额,同旋转介质(HHD)相比,当前的闪存在性能、功耗和机架密度上具有明显优势,随着下一代媒介进入市场,这些优势将持续扩大。
江中散人_Jun
2022/04/11
5.3K0
【重识云原生】第三章云存储3.2节——SPDK方案综述
DAOS分布式存储_用户态文件系统dfuse_IO全路径(任务调度_RPC_RDMA_BULK_SPDK_NVME_EC_SGL等)
分布式异步对象存储(DAOS,Distributed Asynchronous Object Storage)是一个开源的可扩展存储系统,从根本上设计用于在用户空间支持SCM和NVMe存储。DAOS在IO500基准测试中展现出领先的性能
晓兵
2023/09/03
1.3K0
DAOS分布式存储_用户态文件系统dfuse_IO全路径(任务调度_RPC_RDMA_BULK_SPDK_NVME_EC_SGL等)
用mellanox DPU实现裸金属服务器
两种传输协议,mellanox的卡即可以工作于InfiniBand模式也可以工作于Ethernet模式。
惠伟
2021/07/30
9K2
DPU/IPU SPDK存储卸载之用户态vfio(vfio_user)
IPU: Infrastructure Processing Units (lPUs), 基础设施处理单元(硬件卡), 如存储处理/卸载到IPU
晓兵
2024/09/01
6932
DPU/IPU SPDK存储卸载之用户态vfio(vfio_user)
SPDK与iscsi_initiator及libiscsi库源码分析
SPDK initiator模块可与远端的iscsi_tgt配合, 将SPDK的块存储bdev拉远到TGT端, bdev除了可对接iscsi, 还可对接ceph_rbd, nvmeof_tgt等
晓兵
2024/10/26
2820
SPDK与iscsi_initiator及libiscsi库源码分析
全闪分布式存储之PureFlash-极短IO路径-极致性能-极简RDMA和SPDK引擎落盘-支持超融合-IO路径-源码流程及项目简介
极简IO路径, 原生RDMA(verbs)和SPDK引擎落盘加持, 能充分发挥硬件性能, 支持快照, 多副本等, 高可用的高性能分布式存储, 让我们一起见证全闪时代吧!
晓兵
2023/11/25
1.8K0
全闪分布式存储之PureFlash-极短IO路径-极致性能-极简RDMA和SPDK引擎落盘-支持超融合-IO路径-源码流程及项目简介
Intel高性能IO500分布式存储系统DAOS资源汇总-包含RDMA 网络 SPDK NVME TSE 任务调度 异步 事件队列等
DAOS在后傲腾时代的发展策略: https://www.bilibili.com/video/BV1Qw411377s
晓兵
2023/10/16
2.3K0
Intel高性能IO500分布式存储系统DAOS资源汇总-包含RDMA 网络 SPDK NVME TSE 任务调度 异步 事件队列等
【重识云原生】第四章云网络4.7.6节——virtio-blk存储虚拟化方案
        基于virtio的virtio-blk是KVM-Qemu虚拟化生态中的虚拟化块存储的一种实现方式,利用了virtio共享内存的机制,提供了一种高效的块存储挂载的方法。Guest OS内核通过加载virtio-blk驱动,实现块存储的读写,无需额外的厂家专用驱动。Virtio-blk设备在虚拟机以一个磁盘的方式呈现,是目前应用最广泛的虚拟存储控制器。如下是qemu所模拟的PC(基于intel i440fx主板架构)的组成结构图。
江中散人_Jun
2022/06/28
2.3K0
【重识云原生】第四章云网络4.7.6节——virtio-blk存储虚拟化方案
聊聊daos高性能分布式存储
简介 现在大部分应用的IO模型会增加元数据和不对齐的数据碎片比例越来越大,同时传统的存储软件引入的对齐约束和通过大量延迟导致针对这些类型的IO应用越来越差的性能。大容量持久化内存(SCM)和高速硬件结构两者结合的,为重新定义存储规范和高效支持现在的IO密集型应用提供最佳的机会 基于SCM需要重新考虑完整的存储栈的设计,为了释放这些新硬件的性能,新的软件栈采用字节粒度无共享的接口,并且它能够支持大规模分布式存储。DAOS是基于SCM和NVMe的全新的IO架构,通过fabric全局访问对象的地址空间,保证性能的
用户4700054
2022/08/17
3.7K0
聊聊daos高性能分布式存储
分布式存储_高性能RDMA网络_架构设计_性能调优参考_网卡排查命令_笔记
博客: https://logread.cn | https://blog.csdn.net/ssbandjl | https://cloud.tencent.com/developer/user/5060293/articles
晓兵
2023/11/03
5.1K0
分布式存储_高性能RDMA网络_架构设计_性能调优参考_网卡排查命令_笔记
常用学习网站汇总_分布式存储_高性能网络_Linux内核_国际组织_大会等(不定时更新)
https://docs.nvidia.com/doca/sdk/erasure-coding-programming-guide/index.html
晓兵
2023/11/05
7250
常用学习网站汇总_分布式存储_高性能网络_Linux内核_国际组织_大会等(不定时更新)
由mellanox DPU bluefield-2想到的问题
本文全是个人感想和猜测,写一写软件人眼中的硬件,越底层越难,个人理解不一定对,请用批判的眼光看,特此声明,免得被人贻笑大方。
惠伟
2021/08/19
2K0
由mellanox DPU bluefield-2想到的问题
Linux内核(5.10)-IO全路径-文件系统到磁盘-或远端iscsi/nvmeof协议盘
DAX: 磁盘(disk)的访问模式有三种 BUFFERED、DIRECT、DAX。前面提到的由于page cache存在可以避免耗时的磁盘通信就是BUFFERED访问模式的集中体现;但是如果我要求用户的write请求要实时存储到磁盘里,不能只在内存中更新,那么此时我便需要DIRECT模式;大家可能听说过flash分为两种nand flash和nor flash,nor flash可以像ram一样直接通过地址线和数据线访问,不需要整块整块的刷,对于这种场景我们采用DAX模式。所以file_operations的read_iter和write_iter回调函数首先就需要根据不同的标志判断采用哪种访问模式, kernel在2020年12月的patch中提出了folio的概念,我们可以把folio简单理解为一段连续内存,一个或多个page的集合
晓兵
2023/12/07
2K0
Linux内核(5.10)-IO全路径-文件系统到磁盘-或远端iscsi/nvmeof协议盘
如何优化DPU上存储协议(NVMe Over TCP)卸载的性能?
NVMe-TCP 是一种基于 TCP 的高性能流水线存储协议,它抽象了对存储控制器的远程访问,为主机提供了本地存储的幻觉。在 NVMe-TCP 中,每个存储队列都映射到一个 TCP 套接字。读写 IO 操作都有一个唯一标识符,称为命令标识符 (CID),服务器可以无序处理 CID,以允许小 IO 绕过大 IO 并提高性能。此外,每个 PDU 都受发送方生成并在接收方验证的应用层 CRC 保护。
晓兵
2024/11/23
5030
如何优化DPU上存储协议(NVMe Over TCP)卸载的性能?
DAOS_分布式存储_大块数据传输_RDMA_BULK_单边读或写_大IO数据通道_RPC大小IO阈值19K_源码分析
2. 发送端把一段不连续的内存封装为sgl, 调用bulk_create分段注册好(crt_bulk_create(ctx, &sgl, CRT_BULK_RW, bulk))
晓兵
2023/11/08
5450
DAOS_分布式存储_大块数据传输_RDMA_BULK_单边读或写_大IO数据通道_RPC大小IO阈值19K_源码分析
DPU编程语言和框架介绍
2.它与 CPU(通用计算)、GPU(图形/并行计算)并列,是专注于基础设施数据处理的异构计算成员。
霞姐聊IT
2025/06/15
1650
DPU编程语言和框架介绍
DAOS-VOS版本化对象存储-NVME调度-轮询-水位线等流程分析
博客: https://logread.cn | https://blog.csdn.net/ssbandjl | https://cloud.tencent.com/developer/user/5060293/articles
晓兵
2023/11/12
7820
DAOS-VOS版本化对象存储-NVME调度-轮询-水位线等流程分析
推荐阅读
基于DOAS文件系统接口(DFS)暴露的SPDK块设备
8840
NVMe-oF,nvme_cli_initiator与tgt(spdk_tgt)之Fabrics(RDMA)流程源码分析
2.5K0
用SPDK实现存储加速
2.6K0
【重识云原生】第三章云存储3.2节——SPDK方案综述
5.3K0
DAOS分布式存储_用户态文件系统dfuse_IO全路径(任务调度_RPC_RDMA_BULK_SPDK_NVME_EC_SGL等)
1.3K0
用mellanox DPU实现裸金属服务器
9K2
DPU/IPU SPDK存储卸载之用户态vfio(vfio_user)
6932
SPDK与iscsi_initiator及libiscsi库源码分析
2820
全闪分布式存储之PureFlash-极短IO路径-极致性能-极简RDMA和SPDK引擎落盘-支持超融合-IO路径-源码流程及项目简介
1.8K0
Intel高性能IO500分布式存储系统DAOS资源汇总-包含RDMA 网络 SPDK NVME TSE 任务调度 异步 事件队列等
2.3K0
【重识云原生】第四章云网络4.7.6节——virtio-blk存储虚拟化方案
2.3K0
聊聊daos高性能分布式存储
3.7K0
分布式存储_高性能RDMA网络_架构设计_性能调优参考_网卡排查命令_笔记
5.1K0
常用学习网站汇总_分布式存储_高性能网络_Linux内核_国际组织_大会等(不定时更新)
7250
由mellanox DPU bluefield-2想到的问题
2K0
Linux内核(5.10)-IO全路径-文件系统到磁盘-或远端iscsi/nvmeof协议盘
2K0
如何优化DPU上存储协议(NVMe Over TCP)卸载的性能?
5030
DAOS_分布式存储_大块数据传输_RDMA_BULK_单边读或写_大IO数据通道_RPC大小IO阈值19K_源码分析
5450
DPU编程语言和框架介绍
1650
DAOS-VOS版本化对象存储-NVME调度-轮询-水位线等流程分析
7820
相关推荐
基于DOAS文件系统接口(DFS)暴露的SPDK块设备
更多 >
LV.0
这个人很懒,什么都没有留下~
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入[游戏服务器] 腾讯云官方交流站
游戏服运维小技巧 常见问题齐排查
加入COS对象存储交流群
对象存储实践分享 技术方案互助答疑
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档