奇葩字符 "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎" 的简单分析
这个其实之前火过一阵子,当时也没怎么注意,今天看到空间里又有人在刷这个字符了,所以决定分析下他是什么东西、
复制这个字符在控制台查看 "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎".length 发现他的长度是 20,怎么会是20呢?
我们依次调试 "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎".charAt(0), "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎".charAt(1), "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎".charAt(2) 可以发现第一个字符是a 后面都是其他什么东西组成的。
当你黏贴到notepad++之类的编辑器里,也会发现这个问题,后台那些是重复的字符,而且都可以看到。
这些字符到底是什么东西呢?
突然想起js圣经上貌似记载过一个 é 字符,他的 unicode 是 \u00e9, 但是也可以用 'e' + '\u0301' 实现 "é" 前者 length 是 1,后者 length 是 2。
'\u0301' 在这里起到了语调符的作用,然后我就丧心病狂的 'e'+Array(20).join('\u0301'); 发现竟然成功了,果然是这个东西,但是这个语调符有哪些呢。
继续寻找答案,在圣经的注释里发现了他貌似属于 Mn 类,去unicode官方找这个东西,一番寻找后终于找到他了,详情请参阅。
这里解释了 Mn 其实是 a nonspacing combining mark (zero advance width) (谷歌翻译: 一个非空格组合标志(零超前宽度))。
虽然给了解释,但是还是没有说他有那些字符啊,所以我继续寻找答案,功夫不负有心人,终于找到了一张表。
Unicode Characters in the 'Mark, Nonspacing' Category
这里详细的列出了每个编码以及对应的意思,还有图片展现。你可以点击头部那个 View all images 超链接,这样你就不必一个一个展开看图片了。
找到这个的时候我欣喜诺狂,各种测试,发现不仅仅是向上,还有 向左,向下的,但是暂时没发现向右的。
这里面有很多符号,虽然不知道他们在什么情况下使用,但是我的目的达到了,后续的东西暂时没欲望刨根问底了。
下面是我找的几个方向的小尾巴,大家也可以自己去各种测试起来。。
'呵呵'+Array(20).join('\u0310'); // "呵呵̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐"
'呵呵'+Array(20).join('\u031D'); // "呵呵̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝"
'呵呵'+Array(20).join('\u0E47'); // "呵呵็็็็็็็็็็็็็็็็็็็"
'呵呵'+Array(20).join('\u0e49'); // "呵呵้้้้้้้้้้้้้้้้้้้"
'呵呵'+Array(20).join('\u0598'); // "呵呵֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘"
也可以这么玩...
'呵呵'+Array(20).join('\u0310')+Array(20).join('\u0598')+Array(20).join('\u0e49'); // "呵呵้้้้้้้้้้้้้้้้้้้̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐̐֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘֘"
好了,今天的话题到此结束了。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探