查看原文
其他

再谈乱码问题

司海涛 Stata and Python数据分析 2022-03-15

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

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

——爬虫俱乐部

好消息

爬虫俱乐部即将推出研究助理供需平台,如果您需要招聘研究助理(Research Assistant or Research Associate),可以将您的需求通过我们的公众号发布;如果您想成为一个RA,可以将您的简历发给我们,进入我们的研究助理数据库。帮我们写优质的推文可以提升您被知名教授雇用的胜算呀!

我们知道Stata14之前采用的是ASCII编码,Stata14、Stata15采用的是utf-8编码,由于编码的不同,一种版本Stata下的do文件、dta文件在另一种版本的Stata打开时,就会出现乱码;另外,Stata13及之前版本只能识别ASCII编码,当读入utf-8编码类型的外部文件时就会发生乱码,同理,用Stata14、Stata15读入编码类型为ASCII的外部文件时也会发生乱码。遇到以上情况,我们都需要对文件进行转码。那么乱码是怎么产生的呢?什么是转码呢?今天小编就给大家解释清楚这个问题。

我们以一个编码为gb2312的.htm文件(数据链接:https://pan.baidu.com/s/1i6v9LUP)为例,用Sublime打开如下图所示:

charset 属性规定在外部脚本文件中使用的字符编码,由上图可知该htm文件的编码为gb2312,现在如果直接将其读入Stata15,htm文件中的中文将会发生乱码,如下图所示:

infix strL v 1-20000 using mytable.htm, clear

这个时候呢,我们需要将其进行转码,也就是将gb2312的编码转换为utf-8的编码,转码的程序在我们的推文中多次涉及,并且在推文朝花夕拾 | 识得庐山真面目—unicode命令中详细做了介绍,转码程序如下:

clear

unicode encoding set gb18030

unicode translate mytable.htm, transutf8

unicode erasebackups, badidea 

转码后,再次读入:

infix strL v 1-20000 using mytable.htm, clear

如上图所示,乱码问题得到了解决。接着我们用谷歌浏览器将打开这个转过码的htm文件以及原始的htm文件,如下图所示,转过码:

原始文件:

对比原始文件,我们发现转过码的htm文件用谷歌浏览器打开时又发生了乱码。这样乱码-转码-又乱码,是不是感觉一团糟呢?不要着急,听我慢慢道来。首先,要弄清楚上边,unicode的那三行命令是将gb18030的编码转换为utf-8的编码。什么意思呢?

我们用tobytes()函数可以得到utf-8编码下字符串”爬虫俱乐部”的十六进位制编码,关于函数的用法,读者可自行help tobytes查阅。

dis tobytes("爬虫俱乐部",1) 

其中\xe7\x88\xac即为utf-8编码下“爬”的十六进位制编码。可以看到一个汉字对应三个十六进位制编码,这也说明了基础汉字在utf-8编码下占3个字节。

dis tobytes("`=ustrto("爬虫俱乐部","gb18030",1)'",1)

这里我们首先用ustrto()这个函数把字符串“爬虫俱乐部”由utf-8编码转换为gb18030编码,然后再将tobytes函数得到gb18030编码下的字符串“爬虫俱乐部”的十六进位制编码。如上图所示:在gb18030编码下,“爬”的十六进位制编码为\xc5\xc0,每一个汉字对应2个十六进位制编码,说明汉字在gb18030编码下占2个字节。

unicode的那3行命令实际上就是完成了上述过程,即改变了文件中字符的编码。例如将字符串“爬虫俱乐部”的编码由\xc5\xc0\xb3\xe6\xbe\xe3\xc0\xd6\xb2\xbf转换为“\xe7\x88\xac\xe8\x99\xab\xe4\xbf\xb1\xe4\xb9\x90\xe9\x83\xa8”。

那么现在再回到刚开始的问题:

第一, 乱码是怎么产生的?

1.以字符串“爬虫俱乐部”为例,其gb18030下的编码为\xc5\xc0\xb3\xe6\xbe\xe3\xc0\xd6\xb2\xbf,而Stata15只能识别utf-8编码,所以会将\xc5\xc0\xb3当成第一个汉字的编码,\xe6\xbe\xe3为第二个汉字的编码;而事实上在utf-8下,\xe7\x88\xac对应第一个汉字的十六进位制编码,因此读入Stata后发生乱码。

2.再谈为什么转码后的htm文件,用谷歌浏览器打开发生乱码。我们知道转码后,htm文件中字符的编码为utf-8,但是网页的charset=gb2312没有变化,也就是网页按照gb2312的编码方式去识别转码过的字符,于是发生乱码。这时候可以用sublime打开htm文件,将charset=gb2312改为charset=utf-8即可。

第二,什么是转码?

即对同一个字符串从一种编码转为另一种编码。例如前边我们把字符串“爬虫俱乐部”将gb2312编码“\xc5\xc0\xb3\xe6\xbe\xe3\xc0\xd6\xb2\xbf”转换为utf-8编码“\xe7\x88\xac\xe8\x99\xab\xe4\xbf\xb1\xe4\xb9\x90\xe9\x83\xa8”。关于转码我们在推文朝花夕拾 | 识得庐山真面目—unicode命令中详细的介绍了如何使用unicode命令进行转码。在下一篇推文中,我们会给大家总结一下Stata中经常使用的几种转码的方法,敬请关注!

1

END

1


注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

文字编辑/何雪泽

技术总编/刘贝贝


往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.命令sum2docx输出统计量表到docx文件

4.用reg2docx报告你的实证结果吧!

5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件

6.putdocx+wordconvert—将实证结果输出到Word(.docx)文档

7.Stata 15之Markdown——没有做不到,只有想不到!

8.矩阵和宏的故事

9.shellout,open anything

10.Putpdf--神奇的转换工具



关于我们

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

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

投稿邮箱:statatraining@163.com

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


阅读原文

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

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