作者:王美庭 (中南民族大学经济学院)
连享会 - 与君分享 lianxh.cn
本文的目的: 当 Stata 官方提供的
unicode *
命令组和 连老师提供的ua
命令执行完后仍然存在乱码时,可以试试本文的解决方案。本文的主要代码来自于「爬虫俱乐部 精通Stata之数据整理」,在其基础上进行了一些改进 (详情参见本文第三部分),主要包括两个方面:其一,可以对「数字-文字对应表」中的中文乱码进行自动转码。其二,支持批量多文件(夹)转码。
文章目录
1. 问题阐述
时至今日,Stata 已经进入 16 时代代,各项功能日益完善。然而,对于广大中文老用户而言,仍然存在一个历史性问题——转码。
这一切来源于 Stata 14 跨时代地全面启用了适用性更广的 UTF-8 编码格式,从而保证我们的 dofile,.dta, .hlp 等文件中可以支持各种语言和字符,非英语用户再也不用一定使用英语字母作为变量名了。
历史遗留问题在于,对于国内用户,使用 Stata 13 及早期版本保存的 do 文件和 .dta 文件一般为 gb2312 或 gbk 或 gb18030 编码,而 Stata 14 及高级版本采用的是 UTF-8 编码。就像英文单词 he
,在英语里的意思是他、男性,男子;雄性动物
,而在汉语拼音中,可能被认为是和、何、禾
等,所以同样的文字,在不同的编码下,将有不同的含义。于是,国内用户早期版本 Stata 保存下来的 do 文件和 .dta 文件在高级版本 Stata 下那些非英文字符出现乱码也是自然而然的事。
Stata 官方和用户们都给出了一些解决方案。比如,针对国内用户,官方提供了 unicode encoding set gb18030
和 unicode translate *
命令组,以便实现转码 (从编码 gb18030 转码至 UTF-8 ) 命令,以及连玉君老师编写的 ua
命令对其的扩展(这里要注意的是,由于 gb18030 编码包含 gbk ,而 gbk 又包括 gb2312,所以针对国内用户,转码前设置编码 gb18030 即可)。
然而,当文件中包含了不可转换字符,则会导致以上命令无法奏效。当然,我们也可以加上 invalid
选项以保证上述命令被强制执行,但这样很可能会导致数据的部分位置被修改(而我们又不知道哪里被修改了),从而对后期的数据分析产生影响。
2. 解决方案
对于以上问题,在这里我们是怎么处理的呢?
对于 do 文件,处理还是比较简单的,我们在后期版本中打开时软件会自动提示选择何种编码打开,此时我们国内一般选择 gb18030 即可。本文重点在于解决 .dta 文件的转码。我们知道,.dta 文件的乱码一般会出现在数据标签、变量名、变量内容、变量标签、值标签。因此,对于每一个 .dta 文件,我们只需对这些部分利用相关的转码函数进行转码即可。这里看似与官方命令重复了,其实重要区别是如果 .dta 存在不可转换的字符,利用本文的做法,你就能发现不可转换的字符存在何处,然后通过本身对于数据的现有信息,手动更正即可(而对于官方命令,你不知道这里无法转换的字符在何处)。
我们最终的目的在于对于当前文件夹、子文件夹、子子文件夹中的所有 .dta 文件进行转码(由 gb18030 转至 UTF-8 ),如果刚开始就按照这个思维去写程序,这是比较困难的。我们先从单个文件入手,再进入单个文件夹,最后再对三层嵌套文件夹进行操作。
连享会计量方法专题……
2.1 转码程序——单个 .dta 文件
使用说明
这里的目的在于将单个 .dta 文件由 gb18030 编码转换至 UTF-8 编码。前面已经说过,.dta 文件可能出现乱码的地方有:数据标签、变量名、变量内容、变量标签、值标签。因此我们用 Stata 对这些可能出现乱码的地方依次进行转码,最后再将转码后的数据替换原来的数据,以防万一,以下程序还备份了原来的 .dta 文件。
具体的注意事项如下:
- 在当前目录下生成了 ba