查看原文
其他

重建“通天塔” —— Unicode编码与解码

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

本文作者:杨慧琳

文字编辑:王碧琪

技术总编:李朋冲

重磅!!!为了大家能够更好的使用Stata软件,2019年11月8-11日,北京天演融智软件有限公司和武汉字符串数据科技有限公司(爬虫俱乐部)将在大连举办《Stata数据分析技术应用培训》。课程采用Stata公司在今年6月26日推出的新版Stata16软件进行教学,课程通过案例教学模式,旨在帮助大家在短期内掌握Stata的基本命令、编程、数据处理以及熟悉Stata核心的网络数据抓取技术,同时针对最新版Stata中的实用新功能也会做出详细介绍。目前正在火热招生中~


详细培训大纲及报名方式,请点击文末阅读原文呦~



...那时,天下人的口音、言语,都是一样。人类联合起来兴建能够通往天堂的高塔。为了阻止人类的计划,耶和华让人类说不同的语言,使人类相互间不能沟通,计划因此失败,通天塔瞬间崩塌,人类自此各散东西。”

——《圣经·旧约·创世记》第11

 

现实中,语言仍像鸿沟,阻碍着人类的交流。人们为了解决语言的隔阂,想出了各种各样的办法。随着计算机的普及,各国开始制定自己的语言编码方案。尽管各国制定的字符编码可以使用,但在国与国之间经常出现不兼容的情况,犹如崩塌的通天塔。若采用错误的编码方式解读某一文件,将容易产生乱码。为解决传统字符编码方案的局限,世界统一码联盟在1994年正式发布了Unicode(万国码),包括字符集、编码方案等。Unicode把所有语言都统一到一套编码里,为每种语言中的每个字符都设定了统一并且唯一的二进制编码,以实现跨语言、跨平台进行文本转换、处理的要求。

当前,计算机内存统一使用Unicode字符集。我们日常接触到的字符串有文本字符串和字节字符串两种形式。例如,汉字、韩文、英文等这些显式的语言属于文本字符串,而以特定格式存储于计算机内存的为字节字符串。将文本字符串转换为字节字符串,称作编码;而将字节字符串返回为文本字符串,称作解码Unicode字符集可以兼容ASCII编码,当字节在ASCII编码范围内时,编码后则显示为ASCII编码对应的字符。

ASCII编码覆盖0-127位的标准码及128-255位的拓展码,可以表示控制符、通信专用字符、可打印字符以及音标、框线等字符,不同码位对应一个特定字符。在Stata中,可以通过命令“disp char(#)”来查看位于第#位的ASCII标准码对应的字符;或通过命令“disp uchar(#)”来查看位于第#位的ASCII拓展码对应的字符。下表12显示了ASCII标准码及其拓展码表。

1  ASCII标准码

2  ASCII拓展码

 

在数据处理过程中,我们也经常遇到字符串的编码和解码问题,Stata软件也提供了基于Unicode形式的文本字符串和字节字符串之间的转换函数。在本文中我们将分别进行介绍。

(一)Unicode编码

Stata中的函数ustrtohex() 可以实现Unicode编码功能。ASCII码同样可以被编码为对应的Unicode字节字符串,其编码方式与一般文本字符串的相同。对于无效的ASCII编码字符,经ustrtohex()函数转换后使用“\ufffd”表示。例如,“char(200)”是一个ASCII标准码,由于码位200超出0-127的范围,属于无效字符,因此将返回“\ufffd”;反之,“uchar(200)”属于128-255范围内ASCII拓展码,表示的字符为“È”,因此将编码为对应的Unicode字节串。此外,“char(0)”表示空值,将返回“\u0000”。如下:

disp ustrtohex(char(200))disp ustrtohex(uchar(200))disp ustrtohex(char(0))

      

使用ustrtohex()函数,可以将多种语言编码为统一的Unicode字节字符串。例如,我们分别使用汉字、日语、英语表示文本字符串数据,三个文本字符串间采用“@”符号分隔。通过查找上表1“@”符号的ASCII编码为“char(64)”。执行如下命令进行编码:

disp ustrtohex("数据"+char(64)+"データ"+char(64)+"data")

 

其中,“char(64)”被编码为“\u0040”汉字、日语、英语分别被编码为“\u6570\u636e”、“\u30c7\u30fc\u30bf”、“\u0064\u0061\u0074\u0061”,实现了不同语言间的统一。但是,一个英文字符在经Unicode编码后占据5个字节,大大增加了内存。为解决这一问题,可以采用另一种编码方案——UTF-8。对于英语字母,UTF-8 编码和 ASCII 编码是相同的,占用1个字节;汉字占用3个字节,有利于节省存储空间。

(二)Unicode解码

Unicode解码函数为ustrunescape(),可以将字节字符串解析为显式文本字符串。需注意的是,Unicode解码后返回的是字节字符串对应的字符本身。例如,上文我们将ASCII编码“char(64)”编码为字节字符串“\u0040”,但在解码时,其不再返回“char(64)”,而将转换为显示字符串“@”。

我们采用ustrunescape()函数,将上文Unicode字节字符串解析为原有的文本字符串形式,执行程序:

disp ustrunescape("\u6570\u636e\u0040\u30c7\u30fc\u30bf\u0040\u0064\u0061\u0074\u0061")

 

以上就是ustrtohex()ustrunescape()函数的简单用法,在它们的帮助下,Unicode编码与转码将变得非常简单。比如说,我们可以将其和正则表达式结合起来,去匹配基础汉字,以此来提取我们需要的中文文本信息。各国语言被编码为统一的字节字符串形式,重建起人类交流的通天塔,真正实现语言间的互联互通。然而,尽管Unicode使得各国语言可以无障碍转换,但其在节省内存方面还存在一定缺陷。因此,其他Unicode 实现方式,如UTF-8UTF-16等编码方案也竞相兴起,共同为通天塔的建设添砖加瓦。


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

输出分组描述性统计表的利器——report

字典常用操作小结
XPath Helper助XPath爬虫一臂之力
查找变量?用“codebook”!
distinct命令用法一览
Stata数据分析技术应用培训
玩转Python之“手把手”教你爬数据(一)
玩转Python之“手把手”教你爬数据(二
labelsof和labelbook介绍
Statalist上的“火云邪神”
爬虫实战程序的函数封装
Zipfile(二)
利用collapse命令转化原始数据
Stata中的数值型
爬虫实战——聚募网股权众筹信息爬取
duplicates drop之前,我们要做什么?
类型内置函数-type() isinstance()
数据含义记不住?—— label“大神”来帮忙

Zipfile(一)

关于我们

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

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

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

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