乱码问题解决之unicode convertfile
本文作者:张语盈
本文编辑:张 宇
技术总编:薛 原
有问题,不要怕!访问
http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~
爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!
在使用unicode命令进行转码时,我们最常用的是unicode translate(可以查看往期推文《识得庐山真面目–unicode命令》)。今天,我们为大家介绍另一个方便实用的unicode子命令:unicode convertfile。unicode convertfile通常用来转换low-level file的编码,所谓low-level file就是指文本文件,比如我们常见的txt、csv格式的文件。
我们先在help文件中查看unicode convertfile的语法和常用选项。
unicode convertfile srcfilename destfilename, [options]
unicode convertfile命令后面紧跟两个文件名,其中srcfilename是需要转码的文件,destfilename是转码后新生成的文件。这里需要注意的是,unicode convertfile在转码时并不能覆盖原文件,所以我们转码过后srcfilename仍然存在。
该命令常用的选项如下:
① srcencoding( ):设置srcfilename的编码,默认为utf-8;
② dstencoding( ):设置destfilename的编码,默认为utf-8;
③ replace:如果destfilename存在,则替换该文件。
举一个简单的例子来介绍:
首先用copy命令将一个网页的源代码放置到temp.txt文档中,然后用type将这个文件打印在stata的结果输出界面上,程序如下:
clear
cap mkdir "e:/unicode"
cd "e:/unicode"
copy "http://vip.stock.finance.sina.com.cn/corp/go.php/vCB_AllBulletin/stockid/600900.phtml" temp.txt, replace
type temp.txt
结果如下图(部分截取),可以看到存在显示为方框的乱码(Mac版中显示为菱形问号)。
我们分别用unicode translate和unicode convertfile来处理乱码,程序如下:
unicode translate转码
clear //清空内存,转码时内存中不能有数据
cd "e:/unicode" //将需要转码的文件所在的路径设置为当前工作路径,转码时文件名前不能有路径。
unicode encoding set gb18030 //设置需转码文件的编码,即将何种编码转为utf-8。网页编码为gb2312,因为gb18030中涵盖了gb2312,所以将此处编码设置为gb18030。
unicode translate temp.txt,transutf8 //对temp.txt进行转码
unicode erasebackups, badidea //删除备份文件,否则无法对相同名称的文件再次进行转码。
type temp.txt //将转码后的文件打印出来。
爬虫俱乐部是您身边的科研助手,能够为您在数据处理、实证研究中提供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:
https://ke.qq.com/course/286526?tuin=1b60b462,
敬请关注!
unicode convertfile转码
copy "http://vip.stock.finance.sina.com.cn/corp/go.php/vCB_AllBulletin/stockid/600900.phtml" temp.txt, replace
infix strL v 1-100000 using temp.txt, clear //unicode convertfile转码前不需要清空内存。
unicode convertfile temp.txt temp1.txt, srcencoding("gb18030") dstencoding("utf-8") replace
type temp1.txt //将转码后的文件打印出来。
上面两个图是将转码后的文件再次打印在stata结果输出界面上(部分截取),我们可以看到乱码不存在了。
虽然两个命令都可以解决乱码问题,可是相对于unicode translate命令在进行转码时的种种要求:转码前清空内存、转码时要将需要转码的文件所在的路径设置为当前工作路径以及转码后删除备份文件,我们明显看到unicode convertfile更为简单方便。
并且对于文本文件来说,unicode convertfile的转码更加通用。对于一般的文本文件,unicode translate 和unicode convertfile都同样适用,但是当我们要读入的文本文档是unicode编码并且其中含有中文时,unicode translate就无法进行有效转码,只能用unicode convertfile或其他命令来处理。
我们通过一个例子来说明。
以国泰安数据库为例,如果我们下载一个txt格式的资产负债表,用记事本打开,通过另存为看到该文件的编码为unicode,并且文件中含有部分中文。
读入该文件,我们发现其中有乱码的存在。
先用unicode translate进行转码:
clear
cd "e:/unicode"
unicode encoding set unicode
unicode translate HLD_Copro.txt,transutf8 invalid
unicode erasebackups, badidea
insheet using HLD_Copro.txt, clear
如图所示,中文文本仍然有乱码存在。
接下来,我们换用unicode convertfile来对刚刚的文件进行转码,程序如下:
unicode convertfile HLD_Copro.txt new.txt,srcencoding("unicode") dstencoding("utf-8") replace
insheet using new.txt, clear
结果如图所示,乱码问题被解决了。
通过上述学习,我们总结unicode convertfile有如下特性:
1.只能对low-level file进行转码。
2.处理low-level file更为简单方便,功能更加强大。
3.转码之后的文件不会覆盖原文件。
当然,前面我们已经证实了这个文本文件是unicode编码,所以除了unicode convertfile,我们同样可以用import delimited 命令的encoding()选项来直接读入该文件,程序如下:
import delimited using HLD_Copro.txt,clear encoding("unicode")
读入的文件不会出现乱码问题。
更多转码内容请大家关注我们腾讯课堂的课程《精通stata之数据整理》。观看学习网址:https://ke.qq.com/course/286526?tuin=1b60b462,敬请关注!
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。