天问

编码中的奇葩问题

(1)$#65279字符问题

最近看到一个钓鱼网页,发现了这个字符问题。当你打开网页的时候,就会发现这个网页头部有一行空白,选中它后却是选中空白。。

本身代码中不存在这个字符串。表面上无法删除它。那么肯定是编码问题!有控制符之类的存在。

把所有字符都显示出来,发现没有问题。文件也是utf-8无rom编码!

通过git diff可以发现正确代码和错误代码有区别,但是看上去却没有任何区别!

接下来只能通过二进制比较了,bcompare查看如下:

综述,可以看到这个钓鱼网站的作者肯定是一个三流程序员写的,就像之前同事代码居然都是GBK+UTF8混合编码。。。

(2)tab字符和空格问题

一般在java/C++开发中,一个tab=4空格。。

而python中,一个tab=2/4/6...

在html中,为了阅读代码,一个tab=2个空格。这都是约定熟成的。Python比较奇葩,A程序员tab定义为2个,B程序员IDE中tab定义为4个。两者协同开发就会出现下面奇葩问题:

你能数的清楚到底有多少个空格吗?

(3)网站中的sql语句:C2A0假空格

比如我最近更新mysql到mysql8后,更新了一下用户信息,用到了如下的sql语句:

CREATE USER 'gz'@'%' IDENTIFIED WITH mysql_native_password BY 'my_gz09';

这是一句很简单的sql语句!可执行却出现语法错误!好了,让我们回到Notepad++中看下什么问题吧:

Notepad++双击默认会选择一个单词,可是目前双击却选中了多个单词!说明空格有问题!!那么做一个全局替换即可:

更深入分析一下,我们来查看一下二进制信息:

空格键在UTF8无rom编码中16进制是20。兼容ASCII两个字节编码。但是还有一种” 空格 “16进制为C2A0,采用4个字节编码,兼容UTF8带rom编码。而当我把这串错误的字符串复制到其他编辑器就会自动转换为” ?“,也就出现了错误! 而 ”?“ 在UTF8无rom编码是 3F

既然知道问题了,以后网页中复制东西,注意空格问题!

博客地址:http://blog.yoqi.me/?p=16342
扫我捐助哦
喜欢 0

这篇文章还没有评论

发表评论