人҉҉要҉҉是҉҉雾霾吸҉҉多҉҉了҉҉,҉҉连҉҉看҉҉东҉҉西҉҉眼҉҉都҉҉是҉҉花҉҉哈哈的҉҉。

去年微信爆出的《你女朋友撤回了一条消息还亲了你一口》那个 bug,让广大微信用户 excited了一把。

今天,小明在微信群和朋友圈看到了这样因缺思婷的消息:

消息栏里显示乱码,朋友圈也在玩:

此时,已到下班时间,但是你们都懂的,我是一个对技术敏感而细致的男人,对技术的由衷渴望明显战胜了凡夫俗子的食欲。

在第一时间知会微信总舵主张小龙后,我马上开始研究这个有趣的乱码。

经过一番调试后,小明发现是 u"\u0489" 这个 unicode 字符 ҉ 搞得鬼,它有一个诡异的名字叫 COMBINING CYRILLIC MILLIONS SIGN,翻译成国语就是 可拼接的西里尔修饰符字母

那么,问题又来了,什么是西里尔字母? 谷歌一下:

西里尔字母主要在俄罗斯、东欧、北亚和中亚等国家使用。截至2011年,欧亚大陆约有2.52亿人使用它作为本国语言的官方字母表,俄罗斯约占其中一半。
……
西里尔语源自希腊语,现代学者认为,西里尔是由西里尔和迪乌斯的早期门徒发展和形式化的。

18世纪初,在俄罗斯使用的西里尔字母由彼得大帝重新改革,新形式的字母变得更接近拉丁字母,几个古老的字母被删除,几个字母是由彼得大帝亲自设计的(如Я,灵感来自拉丁语R)。

(҉,u0489)是西里尔字符系统中的一个修饰词,它无法独立显示,当附着在其他字符前面或后面后,就出出现叠加在字符上面的雾霾效果。

在各种编码系统中,如何表示这个符号呢:

Encoding
HTML Entity (decimal) ҉
HTML Entity (hex) ҉
How to type in Microsoft Windows Alt +0489
UTF-8 (hex) 0xD2 0x89 (d289)
UTF-8 (binary) 11010010:10001001
UTF-16 (hex) 0x0489 (0489)
UTF-16 (decimal) 1161
UTF-32 (hex) 0x00000489 (0489)
UTF-32 (decimal) 1161
C/C++/Java source code “\u0489”
Python source code u”\u0489”

为҉了҉便҉于҉缓҉解҉多҉年҉后҉人҉们҉对҉当҉下҉雾҉霾҉的҉思҉念҉,特҉别҉推҉出҉一҉款҉合҉成҉的҉雾҉霾҉专҉用҉纪҉念҉字҉体҉:雾҉霾҉体҉。҉

雾҉霾҉体҉下҉可҉以҉有҉雾҉霾҉宋҉体҉、҉雾҉霾҉黑҉体҉、҉雾҉霾҉文҉泉҉驿҉以҉及҉超҉级҉雾҉霾҉体҉等҉等҉字҉体҉…҉…҉

其҉字҉体҉的҉技҉术҉实҉现҉很҉简҉单҉,现҉有҉字҉加҉U҉n҉i҉c҉o҉d҉e҉字҉符҉:҉即҉可҉,如:

原҉来҉如҉此҉

就会显示成:

原҉来҉如҉此҉

彦祖老师 wechat