专栏名称: 爬虫俱乐部
Stata技术控,编程技术咨询,数据讨论与分享,编程和实证培训。
目录
相关文章推荐
龙视新闻在线  ·  高校聘请兼职教师,这些人可参与→ ·  昨天  
龙视新闻在线  ·  高校聘请兼职教师,这些人可参与→ ·  昨天  
51好读  ›  专栏  ›  爬虫俱乐部

再谈乱码问题

爬虫俱乐部  · 公众号  ·  · 2018-02-28 11:37

正文

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

喜大普奔~爬虫俱乐部的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. 矩阵和宏的故事







请到「今天看啥」查看全文