没想到!!Unicode 字符还能这样玩?

来源 | 程序通事

责编 |晋兆雨

头图 | CSDN 付费下载自视觉中国


上周的时候,朋友圈的直升飞机不知道为什么就火了,很多朋友开着各种花式飞机带着起飞。

图片来自网络

还没来得及了解咋回事来着,这个直升飞机就????到的微博热搜。

图片来自网络

后面越来越多人开来他们的直升飞机,盘旋在朋友圈上方。于是很多朋友开来他们的坦克,专打直升飞机,一轰一个准。

图片来自网络

好了,说回正题!

程序员朋友应该都很熟悉 Unicode (万国码),它几乎包含世界上所有符号,比如组成直升飞机这几个特殊符号对应的 Unicode 码分别为:

ps:推荐一个网站,可以根据符号搜对应的 Unicode 码:https://unicode.yunser.com/unicode

除了这些正常字符以外,Unicode 还包含着各种各样的奇葩字符。

奇葩字符

除了正常的我们熟知的文字以外,Unicode 中还有一些奇怪的文字,比如下面这些文字

这咋读?某少?
世代?
恩?超出认知范围

除了这些奇怪文字以外,Unicode 还有一些奇葩的的符号。

例如下面一整套麻将牌:

三缺一?

一整套的扑克牌:

对三?要不起!

一整套国际象棋:

不会玩--!

除了这些,通过组合符合,我们还可以造出各种各样的颜文字(๑•̀ㅂ•́)و✧、

另外 Unicode 还收录着我们常用的 Emoji 。

除了这些之外,Unicode 中还有一些特殊字符的,利用这些字符,我们还可以玩出很多有趣的骚操作。

组合字符

Unicode 有一类字符称为组合字符,它可以附加在前一个非组合字符上,从而使整体看起来像是一个字符。

组合字符原来目的是为了解决一些地区语言、文字特殊的需要,比如说泰文声调符号与母音符号。

正常使用的情况下,这些组合字符数量都会有一些限制。但是在 Unicode 组合字符设计上,并没有加这种限制,这样使我们可以无限加这类组合字符。

利用这个特性,可以达到一些恶搞效果,比如「击穿天花板」与「凿穿地板」的效果。

上面实现原理其是利用以下两个组合字符:

上翻字符
下翻字符

只要复制这两个字符相应的 HTML 代码,跟在正常的字符后面,就可以使这两个字符附加在普通字符上,比如下面实现效果为

黑̮̑

Unicode 码值通常使用 U+N(16 进制N 代表码值),比如 A 的码值为 U+0041。

在 HTML 中 Unicode 可以使用 &#N;(十进制,N 代表码值)表示

在 JS 中 Unicode 中需要使用] \uN(16 进制N 代表码值)表示

只要我们在普通字符多复制几个这类附加字符,就可以形成上述「击穿」效果。

还记得上面说的泰文吗,曾经有一段时间贴吧,很流行一种喷射文,比如下面的效果。

 

往左喷、往右喷、左右互喷

这种喷射文实际原理就是利用泰文中声调符号附加在其他正常符号上。

不过现在这个效果貌似已经没办法再复现了,现在我们只能看到这样的效果:

在一些老版本的系统/浏览器可能还能看到这种效果,知道的小伙伴留言区可以告知一下。

零宽字符

Unicode 中还有一类格式字符,不可见,不可打印,主要作用于调整字符的显示格式,所以我们将其称为零宽字符。

零宽字符主要有以下几类:

零宽度空格符 (zero-width space) U+200B : 用于较长单词的换行分隔

零宽度非断空格符 (zero width no-break space) U+FEFF : 用于阻止特定位置的换行分隔

零宽度连字符 (zero-width joiner) U+200D : 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果

零宽度断字符 (zero-width non-joiner) U+200C : 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果

左至右符 (left-to-right mark) U+200E : 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右

右至左符 (right-to-left mark) U+200F : 用于在混合文字方向的多种语言文本中,规定排版文字书写方向为右至左

利用零宽字符不不可见的特性,我们也可以玩出一些骚效果。

空白微博

发布微博的时候,如果内容都是空格,将没办法发布。

但是如果我们将零宽字符,比如说「零宽度空格符 U+200B」复制到微博,这样我们就可以发布空白微博。

我们可以利用 Chrome 浏览器的控制台复制零宽字符,操作方式如下:

发布效果如下:

真的没有改 HTML 导致的.jpg

隐形水印

对于一些内部论坛或者说小说网站来说,可以通过零宽字符在帖子或小说内容嵌入隐形水印。

当这些内容被一些爬虫复制到其他网站时,我们就可以通过隐形水印,轻松查找时那位用户泄漏内容。

隐形水印主要原理就是将用户信息比如用户名,通过一定算法转成零宽字符,这样普通用户浏览时完全看不到这个水印。

如果内容被复制到其他网站,隐形谁赢也被复制,只要找到这个水印,将这些零宽字符反转成用户名即可。

下面展示一种转换方法,JS 代码主要参考以下 Github 项目:

https://github.com/umpox/zero-width-detection

隐形水印生成方法

第一步我们需要将明文字符串每个字符都转成二进制串。

    // 每个字符转为二进制,用空格分隔const textToBinary = username => (username.split('')// charCodeAt 将字符转成相应的 Unicode 码值.map(char => char.charCodeAt(0).toString(2)).join(' '));

示例如下:

第二步,将二进制串转为零度字符串,转换规则如下:

  • 1 转换为 \u200b 零宽度字符(zero-width space)

  • 0 转换为 \u200c 零宽度断字符(zero-width non-joiner)

  • 其他(剩余就是空格) 转换为 \u200d 零宽度连字符 (zero-width joiner)

  • 最后使用 \ufeff 零宽度非断空格符 (zero width no-break space) 作为分隔符

const binaryToZeroWidth = binary => (binary.split('').map((binaryNum) => {const num = parseInt(binaryNum, 10);if (num === 1) {return '\u200b'; // \u200b 零宽度字符(zero-width space)} else if(num===0) {return '\u200c'; // \u200c 零宽度断字符(zero-width non-joiner)}return '\u200d'; // \u200d 零宽度连字符 (zero-width joiner)}).join('\ufeff') // \ufeff 零宽度非断空格符 (zero width no-break space)
);

最终加密方法如下:

const encode = username => {const binaryUsername = textToBinary(username);const zeroWidthUsername = binaryToZeroWidth(binaryUsername);return zeroWidthUsername;
};

使用加密方法将明文字符串加密之后,加密字符串肉眼是看不到了,但是实际还是存在的。

实际上,如果我们将加密之后字符串复制到 ????BEJSON 网站,就可以看到字符。


另外你还可以把加密字符串复制到 IDEA 中,可以看到相应的 Unicode 编码值。

解密隐形水印

知道了加密的方式,解密其实就很简单,我们只要按照相反步骤的来就可以了。

第一步,将隐形水印按照以下规则转换为二进制串。转换规则如下:

  • 使用 \ufeff 分隔字符串

  • \u200b 转为 1

  • \u200c 转为 0

  • 其他字符使用空格

const zeroWidthToBinary = string => (string.split('\ufeff').map((char) => { // \ufeff 零宽度非断空格符 (zero width no-break space)if (char === '\u200b') { // \u200b 零宽度字符(zero-width space)return '1';} else if(char === '\u200c') { // \u200c 零宽度断字符(zero-width non-joiner)return '0';}return ' ';}).join('')
);

调用该方法,隐形水印转成二进制串。

第二步,将二进制再转为相应的字符。

const binaryToText = string => (// fromCharCode 二进制转化string.split(' ').map(num => String.fromCharCode(parseInt(num, 2))).join('')
);

最终解密方法如下:

const decode = zeroWidthUsername => {const binaryUsername = zeroWidthToBinary(zeroWidthUsername);const textUsername = binaryToText(binaryUsername);return textUsername;
};解密示例如下:

短网址

我们常用的短网址,域名后面会跟上一串随机串,从而实现短网址到长网址的映射。比如以下网址:

https://sourl.cn/iLyn9S

然而我们可以利用零宽字符也可以实现短网址的效果,,比如下面这个网站,就可以生成这类短网址。

https://zws.im/

可以看到这个短网址后面看不到任何字符,实际上这后面跟着一串零宽字符。当浏览器访问该短网址时,后端程序只要反解密的后面零宽字符,拿到相应的网址,然后在做跳转就可以到指定的网站。

反解密的原理可以参考上面隐形水印的代码

小心零宽字符

日常开发过程中,我们有时需要从一些文件中读取文本内容,然后做相应的处理。

有时候我们可能会碰到一些诡异的现象,比如我们之前碰到的例子。

后台程序从 Excel 读取文本内容,然后程序中判断是读取的文本内容是否与指定的字符串相等。

然后当我们读取一份 Excel 内容后,返现这段比较逻辑怎么也通过不了。本来以为是 Excel 内容存在空格什么的,但是打开 Excel 仔细一看,跟指定字符串一模一样,并没有什么其他字符。

第一次碰到这种例子,没有什么经验,真的排查了很久,到最后都有点怀疑人生了。最后无意间将文本内容复制到了 IDEA 中,才发现整理混杂着零宽字符!

如果各位小伙伴也碰到这类问题,不妨将复制文本内容,然后到 IDEA 中查看是否存在某些看不见字符~

参考链接

  1. https://juejin.im/post/5d3f01e7f265da03c23ead69

  2. http://zero.rovelast.com/

  3. https://zws.im/

  4. https://imweb.io/topic/5a08a5c7ef79bc941c30d8dd


更多推荐阅读

  • MongoDB 计划从“Data Sprawl”中逃脱

  • 推特惊爆史诗级漏洞,App 恶意窃取用户隐私,云端安全路向何方?

  • Golang 混合写屏障原理深入剖析,这篇文章给你梳理的明明白白!!!

  • 6 年成为 AIoT 独角兽,这位 17 年连续创业者是如何做到的?

  • 如何一眼识别蚂蚁集团身价千万的阿里人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么 APP 纷纷开发“暗黑模式”?优酷最佳实践总结

一、缘起 随着iOS 13和Android 10的正式发布,一个名词"暗黑模式(Dark Mode)"逐渐走入了大家的视野。各大APP都将暗黑模式的适配列入了开发日程,舆情上用户们对暗黑模式支持的呼声也非常的高。优酷主客也顺应时势,启动了相应的技术…

Mongo 安装、配置、启动 Windows

文章目录一、Mongo 安装1. Mongo 下载2. 安装3. 配置环境变量4. 验证5. 连接二、Mongo 配置2.1. 编辑mongod.cfg2.2. 修改dbPath2.3. systemLog路径2.4. 启动Mongod服务2.5. 安装MongoDB服务2.6. 验证一、Mongo 安装 1. Mongo 下载 下载Mongo数据库并安装 https://www.mongod…

混合云存储阵列与云存储网关的协同解决方案

前言 混合云存储阵列(CSA)于2017年云栖大会发布,上市2年多,已经被基因测序,医疗PACS,影视制作,非编,广电,视频监控等行业和场景的客户广泛采用。混合云存储阵列承载了用户…

炸裂!Google这波操作,预警了什么?

我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来,谷歌致力于推动围绕 GoogleCloud 的企业业务,但在这方面一直被亚马逊和微软吊打,这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…

Robo 3T 安装连接 MongoDB

文章目录1. 官网2.安装3. 连接 MongoDB1. 官网 https://robomongo.org 2.安装 3. 连接 MongoDB

何为真正的 FaaS ?阿里舜天平台做了四大创新

导读:数据中心和云计算的超高增速,AI、视频、基因测序等应用对于算力的无尽渴求和摩尔定律发展事实上已经停滞的现实,均给异构加速带来了巨大的应用潜力和商机。但 Faas 解决方案仍有较高的门槛,今天,我们一起了解 Faa…

SOA为什么不“香”了? | 大咖说中台

作者 | 耿立超责编 | 晋兆雨来源 | 《大数据平台架构与原型实现:数据中台建设实战》SOA 所有的理念都是基于现有应用系统展开的,不管是对服务的梳理还是服务之间的交互,都是以现有应用系统为载体的,中台不同于SOA 的地方在于&…

看到抖音上Python工程师晒得工资条,我沉默了......

我是个抖音中毒者闲来无事就喜欢刷抖音最近刷到了一个Python工程师的工资条然后我默默的打开看了然后就默默的关闭了如今Python技术由于大数据、人工智能的兴起Python也越来越火大家都纷纷学Python我不能跟你确保说学完Python你就能拿高工资但是你学完Python肯定有饭吃说不定还…

不用 H5,闲鱼 Flutter 如何玩转小游戏?

阿里妹导读:最近APP游戏化成为了一个新的风口,把在游戏中一些好玩的、能吸引用户的娱乐方式或场景应用在应用当中,以达到增加用户粘性,提升DAU的效果,成本较低。同时在一些需要对用户有引导性的场景,游戏化…

阿里巴巴向全社会开放黑科技:“泡在水里”的服务器

为了让数据中心更绿色,阿里工程曾将服务器“泡在水里”进行散热,节能超70%,今天这项黑科技的神秘面纱被揭开。 2020年1月6日,阿里巴巴宣布将“浸没式液冷数据中心技术规范”向全社会开放。这项规范旨在用一套标准流程为下一代绿色…

VS Code vue 模板

我们希望每次新建.vue文件后,VSCODE能够根据配置,自动生成我们想要的内容。 打开VSCODE编辑器,依次选择“文件 -> 首选项 -> 用户代码片段”,此时,会弹出一个搜索框,我们输入vue, 如下&am…

程序员必备基础:Git 命令全方位学习

来源 | 捡田螺的小男孩责编 | Carol封图 | CSDN 下载自视觉中国掌握Git命令是每位程序员必备的基础,之前一直是用smartGit工具,直到看到大佬们都是在用Git命令操作的,回想一下,发现有些Git命令我都忘记了,于是写了这篇…

eBay邓明:dubbo-go 中 metrics 的设计

最近因为要在 Apache/dubbo-go(以下简称 dubbo-go )里面实现类似的这个 metrics 功能,于是花了很多时间去了解现在 Dubbo 里面的 metrics 是怎么实现的。该部分,实际上是被放在一个独立的项目里面,即 metrics 。 总体…

稳定性专题 | Spring Boot 常见错误及解决方法

导读 『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测、故障演练、JVM、应用容器、服务框架、流量调度、监控、诊断等多个技术领域,以更结构化的方式来打造稳定性领域的知识库。 Spring Boot 作为 Java…

vue3 线上环境 ctx 无法识别

解决方案: Vue3获取当前组件实例的 getCurrentInstance 方法上 ctx 生产获取不到 上面的全局方法, getCurrentInstance代表上下文,即当前实例。ctx相当于Vue2的this, 但是需要特别注意的是ctx代替this只适用于开发阶段,如果将项目…

新职业风口已至!人社部宣布这10个职业缺口近千万!

负责阿里小蜜产品的陈海青是阿里最年轻的P9专家,才30岁出头,已经年入百万。小编的前领导,农村出身毫无背景,但是抓住风口卖掉了手里的比特币全款买了学区房,让他的孩子赢在起跑线上。面对这些踩在风口上的幸运儿&#…

一小时快速搭建基于阿里云容器服务-Kubernetes的Web应用

本文面向的读者 如果您是一个Kubernetes的初学者,本文可以帮助你快速在云上搭建一个可实际使用的集群环境,并发布自己的第一个应用。你无须提前准备任何的硬件资源或者下载任何的软件包。 如果您已经有一个自建的Kubernetes集群,想要尝试阿…

VS Code Git 日常操作

文章目录1. 初始化Git仓库2. 新建分支3. 提交4. 同步远程4.分支切换5. 合并分支1. 初始化Git仓库 使用**ctrl**召唤出命令窗口 # 初始化Git仓库 git init2. 新建分支 点击右下角的master,上方就会出现一个输入框,点击正在创建新分支,输入…

bootstrap table 列拖动变宽

需要导入 colResizable-1.6.min.js /**_ _____ _ _ _ | | __ \ (_) | | | | ___ ___ | | |__) |___ ___ _ ______ _| |__ | | ___ / __/ _ \| | _ // _ \/ __| |_ / _ | _ \| |/ _ \| (_| (_) | | | \ \ __/\__ \ |/…

阿里产品专家:高情商的技术人,如何做沟通?

不愿沟通是固执,不会沟通是傻瓜,不敢沟通是奴隶。 ——德拉蒙德 工作中,你是否经常看到别人在会上谈笑风生、纵横捭阖,但自己却唯唯诺诺,不敢表达观点?即便鼓起勇气发言却不被重视,经常被人打断…