当前位置:C++技术网 > 资讯 > 网上复制代码要小心,很可能会带入乱码字符

网上复制代码要小心,很可能会带入乱码字符

更新时间:2017-08-15 23:15:25浏览次数:1+次

        现在网上有很多共享代码,包括我们的C++技术网。有了现成的代码,我们一般都是直接将代码复制到本地,然后就开始编译运行了。但是,复制代码真的安全吗?

        有些编译器做的好些,兼容性也强,对于很多异常的字符可以过滤。而有些编译器就比较弱,可能遇到异常的字符时就直接报错。所以,表面上写的好好的代码,复制过去,你竟然无法编译。问题就在于代码中隐藏的乱码字符。

        关于隐藏的乱码字符的研究,请仔细阅读《Windows、Linux文件互用的乱码问题深入研究及彻底解决乱码问题》。此文已经详细讲述了隐藏的乱码形成的原因和解决办法即不要在乱码文件中直接删除字符。

        然而隐藏的乱码来源并不只有直接删除字符引起的。不过,直接删除本身就有乱码的文件的字符,遗留了一些字符编码,因为其他编码都无法表示出来,所以就成了隐藏的乱码。不管转为什么编码,都不正常。我们删除带有乱码的文件产生的隐藏乱码字符是最初的乱码来源。然而这些乱码通过网络可以轻易的传播开来。因为这些乱码字符本身就是一个字符编码,只是没有对应的字符而已。所以在文本中是可以携带的,通常表现为空格一样字符,但不是真的空格,只是无法显示,一般都显示为空格或者问号了。

        我们来看一个真实的例子:我们从文章《libuv服务器端包装类源代码分享》共享的代码里复制,然后看看复制后的代码是什么样的。放在Notepad++里是这样的:

    网上复制代码要小心,很可能会带入乱码字符

        我们已经设置了Notepad++显示所有字符,而这里看到的空格并不是真正的空格,只是无法对应到字符的乱码而已。我们再来用UE看看:

    网上复制代码要小心,很可能会带入乱码字符

        同样,我们也显示所有的字符,这里依然可以看到不是空格字符的空格。Notepad++和UE都将不支持的字符显示了空格。那么我们来换一个编辑器,换成Linux的vim编辑器。结果如下:

    网上复制代码要小心,很可能会带入乱码字符

        现形了!!!vim编辑器将不支持的字符用问号表示出来了,而不是直接显示为不是空格的空格。而这些不可表示的字符,在一些编译器可能就会表现异常了。不过我提供的这个代码是从网上复制下来的,然后经过改造,再分享出来了。殊不知,这个过程,竟然一直在携带者隐藏的乱码字符。因为VS等编译器比较强大,可以处理好这些乱码字符,然而像python解释器就不能处理好,就会报编码错误。

        所以,现在你应该知道,随便在网上复制代码,为什么总会出现一些莫名其妙的错误了吧。当然,VS也有不能处理的字符的,也会提供文件编码有问题的。

        知道了问题,那么我们就来解决问题吧。在前面提到的文中了,我们是避免创造这样的隐藏的乱码字符。本文我们是如何避免被传播中的乱码中招。也就是说,如何安全的复制代码?

        我们可以借助Notepad++或UE软件,在视图菜单中,设置显示所有字符。如果代码中有中文,那么新建的文件设置为UTF-8格式。然后将代码复制粘贴到新建的文件中。此时你简单观察一下,如果还是显示为空格的字符,用查找替换的方式一并替换为空格。这样被替换之后,原来看到的空格是有一些符合代替显示的,Notepad++用点号代替显示空格,UE用下划线代替显示空格。这样,再将处理过的代码放到编译器编译,就没有奇怪的问题了。

        建议你形成这样的习惯,也避免传播这样的带有乱码的字符的代码。复制的人就少些麻烦。自己养成习惯之后,也可以避免很多不必要的问题。