查看原文
其他

乱码问题解决之“锟斤拷”

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张语盈

本文编辑:李朋冲

技术总编:薛   原

爬虫俱乐部将于2019年1月19日至25日在武汉举行两期Stata编程技术定制培训,此次采取初级班和高级班分批次培训模式,采用理论与案例相结合的方式,旨在帮助大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。详细培训大纲及报名方式,请见往期推文《2019寒假Stata编程技术定制培训班》。报名表下载请点击文末阅读原文呦~

乱码是我们在用stata读入文件时经常会出现并且令人头疼的问题,当我们错误定义了读入文件的编码时,就可能出现一些特殊的乱码问题。今天为大家介绍其中一种比较常见的乱码问题----“锟斤拷”及其解决方法。

“锟斤拷”是一串经常在搜索引擎页面和其他网站上看到的乱码字符,如下图所示的某个单位招聘信息中,联系人和联系人职位两项,就无法被正确识别出来。

“锟斤拷”源自于GBK字符集和Unicode字符集之间的转换问题。在Unicode和原有编码体系的转化过程中,有一些字符用Unicode是无法表示的,Unicode官方用了一个占位符来表示这些无法表示的字符,这个字符用unicode转义字符表示为\ufffd,对应的utf-8编码为“EFBFBD”。如果这个编码重复两次,然后放到GBK/GB2312/GB18030的环境中显示时,一个汉字占据2个字节,最终的结果就是:锟斤拷——锟(EFBF),斤(BDEF),拷(BFBD)

举一个简单的例子来解释这种乱码问题。

首先从国泰安数据库上下载一个CSV格式的资产负债表,用import delimited命令读入,并设置读入文件的编码为utf-8。程序如下:

clear
import delimited using 资产负债表.csv, encoding("utf-8")

可以看到变量stkcd的标签出现了乱码。

这个乱码是什么?我们先来看一下它的庐山真面目。

local stkcdlab: variable label stkcd label var stkcd `=ustrfrom("`stkcdlab'", "gb18030", 1)'

结果如图:

我们可以看到,与爬虫俱乐部之前的推文《Unicode失效时如何转码dta文件?》中介绍过的转码方法不同,变量标签在转码后仍然存在特殊的乱码,也就是我们前文提到的“锟斤拷”。

接下来,我们从乱码标签和字符串“Stkcd”的区别入手观察二者有何差异。

clear
import delimited using 资产负债表.csv, encoding("utf-8") local stkcdlab: variable label stkcd disp tobytes("`stkcdlab'",1) disp tobytes("Stkcd",1)

结果如图:

乱码标签比字符串“Stkcd”多了\xef\xbf\xbd\xef\xbf\xbd

我们选择用两种方法来解决这个乱码问题。

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙30000+粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩的讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以重复观看,百分百好评,简单易学,一个月让您从入门到精通,绝对物超所值!

爬虫俱乐部最近一次的网课为大家系统整理了各种stata读入文件乱码问题的解决方法,请大家关注爬虫俱乐部腾讯课堂的课程《精通stata之数据整理》。基本上,我们会按照一周一次课的频率持续更新学习内容,欢迎大家前去学习!课程网址:

https://ke.qq.com/course/286526?tuin=1b60b462,敬请关注!


方法一

该方法是把乱码部分替换为空,这样,乱码标签就能够变为"Stkcd"了。根据前面的介绍,我们可以用\ufffd表示乱码内容,而正则表达式可以使用这一类unicode转义字符,因此我们用正则表达式替换函数把乱码删除,程序如下:

clear
import delimited using 资产负债表.csv, encoding("utf-8") local stkcdlab: variable label stkcd label var stkcd `=ustrregexra("`stkcdlab'", "\ufffd", "")'

结果如下图所示,乱码问题得到了解决。

方法二

“锟斤拷”出现的原因是不同编码之间转换过程出现了问题,我们在读入的时候,没有选择正确的编码。如何选择正确的编码读入文件呢?首先,将文件“资产负债表”用记事本打开,点击文件,选择另存为。

可以看到下面的编码显示的是Unicode编码,所以直接在encoding()选项后面选择Unicode来读入。然后乱码问题即得到解决。

clear
import delimited using 资产负债表.csv, encoding("unicode")

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存