字符编码问题三个不可见的字符(0xEF-0xBB-0xBF,即BOM)

发布时间:2020-10-10 阅读 3266

Stata 连享会   主页 || 视频 || 推文

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者:连玉君 (中山大学)
E-Mail: arlionn@163.com


目录


1. 背景

今天在编写 GTALabel.ado 小程序时遇到了一个问题,分享一下我的解决思路。

这个问题困扰我好几天了,没心思干别的事情。

问题: Windows 系统的 txt 文件在使用 utf-8 编码保存时会默认在文件开头插入三个不可见的字符:0xEF 0xBB 0xBF,称为 BOM 头。 对此问题的详细讨论参见 「Windows文本文件编码」

其间,一度想偷懒询问 Stata 公司的老大哥 Peng Hua 博士,或是 Boston College 的 Baum 教授,也想到了李春涛和王群勇。询问之前,我需要把我的问题说清楚。于是,做了一个极简的例子 (下面会看到),然后把我能做的各种尝试都写在里面,让他们知道我实在是不得已才麻烦他们的。

首先是在 Stata List 论坛里搜索,关键词包括:txt BOMimport delimited 等。唯一一篇相关的帖子虽然涉及到了这个问题,但并未给出解决方法:「Cannot destring numbers--hidden characters? - Statalist」

无奈这下,只好扩大搜索范围。

就读取 txt 文件而言,其他软件也存在相似的问题,例如,python 读取带 BOM 的 utf-8 格式文件

也有人提到了 DOS 下的批处理命令:批处理命令下如何删除utf-8编码的txt文本的bom头?

2. 问题和解决思路

Windows 系统的 txt 文件在使用 utf-8 编码保存时会默认在文件开头插入三个不可见的字符:0xEF 0xBB 0xBF,称为 BOM 头。

打开 txt 文档无法看到这三个字符,第一行的首字母也是左边对齐的: Windows 系统中的 abc.txt 文件会包含 BOM 字头用以表明这个文件是 UTF-8 编码的

import delimited 导入 Stata 后似乎看不出问题,因为数据浏览窗口是看不到隐藏字头 BOM 的:

. import delimited "abc.txt", encoding(utf8) clear // UTF-8 编码
. format v %-5s
. browse
UTF8 编码下的 txt 文本导入 Stata 后首行会包含两个两个空格 (其实是 BOM 而不是空格)
UTF8 编码下的 txt 文本导入 Stata 后首行会包含两个两个空格 (其实是 BOM 而不是空格)

事实上,这个 BOM 虽然是隐藏字符,但却是占位置的:上图中的两个「伪空格」占了三个字母 (= 5-2) 的位置。

. gen numb = length(v)     //字符个数统计
. list v numb, clean noobs
. import delimited "abc.txt", encoding(Cp1252) clear //  Windows Latin-1
. format v %-5s
. list v, clean noobs

结果如下:

Windows Latin-1 编码下的隐藏字符 BOM
Windows Latin-1 编码下的隐藏字符 BOM
abc.txt 文件的十六进制编码情况-A
abc.txt 文件的十六进制编码情况-A
abc.txt 文件的十六进制编码情况-B
abc.txt 文件的十六进制编码情况-B
image.png
image.png

3. 最终解决办法

事实上,上述代码的思路是没有问题的,只是对于 BOM 头文字的编码顺序设定有误,同时,还需要考虑你的编码是 UTF-8UTF-16 还是 UTF-32。如下代码最终解决了我的问题:

// drop BOM characters (byte order marks)
   tempfile filesource_noBOM
   filefilter `"`filesource_temp'"' `"`filesource_noBOM'.txt"', from("\EFh\BBh\BFh") to("") replace 

主要参考了如下资料:

4. 参考资料

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD