查看原文
其他

带你玩转Stata编码

爬虫俱乐部 Stata and Python数据分析 2023-01-01

本文作者:王宇晖 南加州大学医学院公共健康数据科学硕士

本文编辑:赵微微

技术总编:李婷婷

Stata&Python云端课程来啦!

      好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程Stata进阶课程Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

引言从ASCII到GB2312再到Unicode,编码系统随着计算机的发展而不断进步。而若想要在Stata中如鱼得水地爬虫,那就一定绕不开一些关于编码的问题。今天,笔者在这里给大家介绍两个编码系统和Stata中基于这两个系统的几个关于字符编码的常用函数。PART
01编码系统介绍

1.ASCII码

ASCII码(American Standard Code for Information Interchange,美国信息互换标准代码)是由美国国家标准学会(American National Standard Institute , ANSI )制定的,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,现在已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,适用于所有拉丁文字字母。同时,它是现今最通用的单字节编码系统,等同于国际标准ISO/IEC 646。

ASCII码大致由三部分组成:

(1)ASCII打印字符:数字32-126分配给了能在键盘上找到的字符。

(2)ASCII非打印控制字符:数字0-31分配给了控制字符,多用于控制一些外部设备,如打印机等。

(3)扩展ASCII打印字符:扩展的ASCII字符在已有的128个字符中又增加了128个字符。即便如此,仍然有一些语言无法包含在这其中。因此,出现了ASCII的变体来囊括这些地区性的字符和符号。

2.Unicode码

在ASCII码之后,由于各个国家都搞了自己语言的一套编码标准,但是互相不兼容。于是,ISO (国际标谁化组织)想到了一个“秦始皇统一六国”的方法——废除地区性编码方案,重新制作了一套包含全球所有语言的编码,名叫”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。

Unicode又称为统一码、万国码、单一码,是国际组织制定的旨在容纳全球所有字符的编码方案,包括字符集、编码方案等,它为每种语言中的每个字符设定了统一且唯一的二进制编码,以满足跨语言、跨平台的要求。其中,在UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。

PART
02编码函数介绍

1.char(n)

描述:得到对应ASCII码或扩展ASCII码n的字符;如果n不在可行域中,得到空字符串""。

需要注意的是,从Stata14开始,Stata在所有平台上的显示编码都是UTF-8。在扩展ASCII码中(即当n的范围为128-255时),char(n)函数是一个无效的UTF-8序列,因此将显示一个问号(�)。有两个对应于char()的Unicode函数:uchar()和ustrunescape()可以用来显示这些字符和符号。

下面我们来试验一下:




可以看到,十进制数字33在ASCII码表中对应的是感叹号,因此显示出一个感叹号。而数字128因为在扩展码中,因此显示出了一个问号。

2.uchar(n)

描述:得到对应于Unicode码位n的Unicode字符,如果n超出Unicode码位范围则为空字符串。

这里要注意的是,uchar()接受的是Unicode代码点的十进制值。而ustrunescape()接受的是Unicode码位的转义十六进制数字字符串。例如,uchar(8364)和ustrunescape("\u20ac")都会产生欧元符号(€)。

这里解释一下,代码点是表示文本系统(如 ASCII 或 Unicode)中单个字符的数值或位置。原始的 ASCII 编码系统只包含 128 个码点,因此只能表示 128 个字符。从历史上看,扩展 ASCII 的 128 个附加字节已以许多不同且不一致的方式编码,以提供附加的 128 个代码点集。正式的 Unicode 规范有 1,114,112 个可能的代码点,其中大约 250,000 个已分配给实际字符。Stata 对 Unicode 使用 UTF-8 编码。请注意,代码点的 UTF-8 编码版本与代码点本身的数值不同。简单来说char()里面的n是ASCII码的数值,而uchar()里面的是Unicode的代码点,两个函数对应的不同的换算表。

3.tobytes(s[,n])

描述:将最多200字节的Unicode数字字符串s转义为十进制编码或十六进制编码。如果n未被指定或为0,则生成十进制编码,格式为:\dDDD;否则生成十六进制编码,格式为:\xhh。

现在我们转义一下字符串"a1",结果如图:




这时我们再来对照上面的ASCII对换表,不难发现,字符“a”对应的十进制ASCII码为97,十六进制ASCII码为61;而字符“1”对应的十进制ASCII码为49,十六进制ASCII码为31,与ASCII对换表完全符合。

现在假定我们把字符串“爬虫“转义为十进制编码,结果如图所示:



我们知道,一个汉字占用三个字节,所以在UTF-8编码下,“爬”字的十进制编码为:\d231\d136\d172。“虫”字的十进制编码为:\d232\d153\d171。再试一试将这两个字转义为十六进制编码,结果如图:


不难看出,“爬”字在UTF-8编码下的十六进制编码为:\xe7\x88\xac。“虫”字的十六进制编码为:\xe8\x99\xab。

4.geturi()

此外,还有一个函数geturi(),可以得到一个字符串的URL编码。URL编码,通常也被称为百分号编码,它的编码格式采用的是ASCII码,而不是Unicode码。URL编码就是一个字符的ASCII码,它的ACSII码的十六进制式,在前面加上"%",就是它的URL编码。URL编码原理是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符,可以避免URL中有些字符会引起歧义。

例如:"\"的ASCII码是92,92的十六进制是5c, 所以"\"的URI编码就是 %5c。

这里我们还用汉字“爬虫“来试验一下:



可以看到,抛去格式,URL编码内容相较于上图tobytes()函数示例中的只有字母由小写变为大写,所以相对于tobytes()函数转义的格式为\xhh的十六进制编码,geturi()函数转义出的十六进制编码格式为%HH。

5.ustrtohex(s[,n])

描述:将最多200字节的Unicode字符串转义为十六进制编码。

当代码点小于\uffff时,转义的十六进制字符串格式为:\uhhhh;而当代码点大于\uffff时,格式为:\Uhhhhhhhh。当参数n被指定且大于0时,该函数将会从第n个字符开始转义。除此之外,任何无效的UTF-8编码将会被替换为Unicode替换字符:\ufffd。

现在我们来把“爬虫”字符串和字母“abc“转义为十六进制编码:




可以将字符串转义为十六进制,可是怎么将他们取回呢?这里就要用到解码函数。

6.ustrunescape(s)

描述:得到转义后序列对应的Unicode字符串。

该函数可以识别以下格式的转义序列:4位十六进制数字格式 \uhhhh;8 位十六进制数字格式 \Uhhhhhhhh; 1-2位十六进制数字格式 \xhh和 1-3 位八进制数字格式 \ooo,其中 h 的取值范围是 [0-9,A-F,a-f],o 是 [0-7]。标准 ANSI C 转义的 \a, \b, \t, \n, \v, \f, \r, \e, \", \', \?, \\ 也可以识别。

需要注意的是十进制的编码将无法被ustrunescape识别。

现在我们来用这个函数取回字符串“爬虫“和”abc”,如下图所示:


这里需要注意的是,Stata并不能自动识别格式为\xhh的中文字符,原因是汉字的三个编码是连续的,而该函数不能自动将三个字节放在一起来识别,所以会把他们一一按照ASCII码来对换。


参考文章

1.“编码格式发展历史及简介” 编码格式发展历史及简介_dk_0520的博客-CSDN博客, 13 Apr. 2017, https://blog.csdn.net/dk_0520/article/details/70157426. 


2.黄 勇. “Unicode编码详解(一):Unicode简介及其分类.” Unicode编码详解(一):Unicode简介及其分类_hyongilfmmm的博客-CSDN博客_unicode, 12 Feb. 2022, https://blog.csdn.net/hyongilfmmm/article/details/112037596.


3.“十六进制编码_前嗅教你大数据:常见几种编码介绍.” 十六进制编码_前嗅教你大数据:常见几种编码介绍_weixin_39529128的博客-CSDN博客, 前嗅来源, 26 Dec.2020,https://blog.csdn.net/weixin_39529128/article/details/112730038.

END

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:


最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!





往期推文推荐

一言不合就teamviewer

【基础篇】循环语句的continue与break

      教你用Stata爬取全国疫情风险地区数据,原来这么简单!【数据结构】集合的使用方法      Stata爬取七普人口数据

       浅析Python的序列化与反序列化

     爬虫俱乐部的精彩答疑--爬虫为何失败?

       利用Stata批量制作学生证     【数据分析-入门】科学计算基本库—Numpy的简单使用      Stata绘图系列——玩转绘图通用选项之图例     【基础篇】数据类型介绍——list、tuple和range对象

覆盖北交所的“cnstock”复工了!

高考热度大数据爬虫——谁才是院校顶流

跨框架数据操作

      河南大学经济学院2022年Stata数据处理与爬虫技术开班仪式顺利召开

爬虫俱乐部的精彩答疑——local function

爬虫俱乐部精彩答疑——Python中的三种文件读取方法爬虫俱乐部的精彩答疑--认真仔细方能写出好程序
爬虫俱乐部Python精彩答疑——更换Jupyter Notebook浏览器及dropna()参数详解
       爬虫俱乐部的精彩答疑--如何打开Excel中扩展名与文件源码不符的文件

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可

以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。




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

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