「别人发来的 txt 一打开全是方块和问号」「Excel 打开 CSV 中文全是乱码」——这类问题几乎都指向同一件事:文件没坏,是读取时用错了编码。搞清楚这一点,九成的乱码不用重装软件就能解决。
先说三个结论,后面逐个展开:
- 乱码不是文件损坏,是编码对不上。 同一个字节序列,按 GBK 读和按 UTF-8 读会得到完全不同的文字。文件本身完好,换一种读法就正常了。
- UTF-8 不是万能解药。 转成 UTF-8 能让现代软件都读对,但一些只认 GBK 的老旧 Windows 软件、部分税务与政务客户端反而会因此打不开。
- Excel 打开 CSV 乱码,问题常不在文件在 BOM。 勾上 BOM 往往直接解决,这是 CSV 特有的坑。
一、乱码是怎么产生的
计算机存文字,存的是数字。「中」这个字在 GBK 里是两个字节 0xD6 0xD0,在 UTF-8 里是三个字节 0xE4 0xB8 0xAD。同一个文件的字节不会变,变的是读取时按哪张表去查。
按错表的结果有两种:
- 把 UTF-8 当 GBK 读:每个字节落在 GBK 的编码区间里,于是显示出两个不相干的汉字,典型的「鍥藉奖鐢ㄦ埛」这类乱码。
- 把 GBK 当 UTF-8 读:UTF-8 有严格的字节结构校验,GBK 的字节序列往往不合法,读取直接失败,显示成替换字符
�或问号。
所以看到乱码先别慌,文件内容是好的,只是需要按正确的编码重新读一遍。用文本编码转换指定源编码读一次,正常了再决定要不要真的转换。
二、几种常见编码各自适用什么
不需要记住全部,知道各自的地盘就够用:
| 编码 | 主要使用者 | 特征 |
|---|---|---|
| UTF-8 | 现代软件、网页、跨平台数据交换 | 变长编码,兼容 ASCII,国际通用 |
| GBK / GB2312 / GB18030 | 老旧 Windows 软件、部分政务税务客户端 | 中国大陆早期标准,一个汉字占 2 字节 |
| Big5 | 繁体中文环境、部分港台老文档 | 台湾香港传统编码 |
| Shift_JIS / EUC-KR | 日文 / 韩文环境 | 按对应语言选 |
| Windows-1252 / Latin-1 | 西欧语言老文档 | 单字节,装不下中文 |
记事本的「ANSI」是个容易误解的标签。 它不是一个具体编码,而是「系统当前默认的本地编码」——在中文 Windows 上通常指 GBK,在英文 Windows 上指 Windows-1252。所以看到「ANSI」要按中文系统默认的 GBK 去试,这也是为什么在英文系统上打开中文文件必然乱码。
三、记事本打开 txt 乱码
顺序是:先判断文件的真实编码,再转换。
- 让工具自动判断。 自动探测会先按 UTF-8 严格校验,失败再回退到 GBK 类编码,并告诉你判断依据。大多数情况这一步就够。
- 预览确认。 工具提供前若干字的解码预览,中文正常显示再往下走,避免转错方向。
- 选目标编码。 给现代软件用就选 UTF-8;给老旧 Windows 软件用则保持 GBK。
如果自动判断失败,手动指定源编码逐个试。判断不了时记住一条经验:中文文档在 UTF-8 出现之前的,基本都是 GBK。
四、Excel 打开 CSV 乱码
这是最容易被误导的一类。CSV 本身只是纯文本,用 Excel 双击打开时,Excel 不按 UTF-8 解析,而是按系统本地编码(中文系统上是 GBK)——于是 UTF-8 存的 CSV 必然乱码,而文件本身完全正常。
解决办法分两种,取决于你能不能改文件:
- 能改文件:转换时勾上 BOM。BOM 是文件开头的一个不可见标记,Excel 见到它就按 UTF-8 解析,双击直接正常。
- 不能改文件:用 Excel 的「数据 → 自文本 / 从文本」导入,在导入向导里手动把编码指定为 UTF-8。
但 BOM 不是无条件该加。 给程序读取的文件通常不要 BOM——很多解析器会把开头这几个字节当成内容,导致第一行 header 解析出错。BOM 是专门为 Excel 这类「不告诉你用什么编码」的软件准备的补丁。
五、什么情况下不该转 UTF-8
「全部转成 UTF-8」是常见但错误的直觉。以下情况应该保持或转成 GBK:
- 老旧的 Windows 客户端软件:部分税务申报、政务系统、行业专用软件只认 GBK,喂 UTF-8 会直接乱码或报错。
- 目标环境未知的交换文件:对方没说他用什么打开,转过去可能反而坏事故。
- 含生僻字、emoji、日韩文字的内容:GBK 收录的汉字有限,这类字符在 GBK 里不存在,转换时会被替换成问号。需要完整保留就用 UTF-8。工具会在转换后提示有多少个字符无法映射,看到这个数字大于 0 就要重新考虑目标编码。
顺带一提换行符:Windows 记事本习惯 CRLF,Linux 与代码环境用 LF。混用有时会让脚本报诡异的错误,转换时可以顺手统一。
常见问题
文件打开乱码,是不是下载坏了?
几乎不是。下载损坏通常表现为文件打不开、大小异常或结尾截断;乱码而文件大小正常,基本可以断定是编码问题,重新读一遍就好。
为什么同样的文件,我电脑上正常,同事电脑上乱码?
系统默认编码不同。中文 Windows 默认 GBK,英文 Windows 默认 Windows-1252,同一个 GBK 文件在后者上必然乱码。这也解释了为什么跨国传输的文件更容易出问题。
转成 UTF-8 后部分字变成问号了,能恢复吗?
不能。被替换成问号的信息已经丢失,这是不可逆的。只能从原始文件重新转换,并改用不会丢失字符的目标编码。
批量处理很多文件,一个个改太慢。
先把自动判断跑一遍,确认同一批文件编码一致后再统一转换,比逐个试快得多。混用编码的批处理最容易出错。