文档与 OCR实用指南

CSV中文乱码先别另存:用UTF-8原件、BOM与三行数据定位

CSV显示乱码时,先关闭错误预览并保留原文件,再按文件的实际编码重新导入。直接把乱码另存为UTF-8,可能只是把错误字符保存得更牢。本文用两份只差BOM的原创CSV,判断何时重开原件,何时必须找回更早版本。

方格纸上排列的手写汉字,作为字符核对的配图
配图:jason hu · Unsplash License文字资料摄影配图;本文CSV姓名与金额是原创教学材料。

先把问题解决

练习里的UTF-8原件无论是否带EF BB BF开头,正确解码后都应得到上海、Zoë、東京,编号0007/0008/0009和金额12.50、0.00、7.50,合计20.00。BOM帮助部分接收程序识别编码,不负责选择分隔符或保留编号类型,也不能修复已经变成问号或替换字符的原文。

先看症状,再选修复方向

乱码、挤成一列和编号少了零,分别指向字符解码、字段边界和列类型。一次“看起来不对”不能合并成一种问题。先在副本上确认哪一层发生变化,不要为了让预览顺眼而删除异常字符或给整张表统一转数字。

Microsoft的文本与CSV导入说明区分直接打开与通过导入选择解析方式。本文保留当前程序默认设置,不修改操作系统地区;只针对这份文件选择编码和分隔符。

把三种可见问题分开
看到的现象先检查本例正确状态
上海变成无意义字符原始字节与所选编码上海、Zoë、東京逐字符一致
整行落在一个单元格逗号分隔设置3列,含表头共4行
0007变成7编号列被转为数字三个ID保留文本

两份原件,正文完全相同

练习包中source-utf8.csv与source-utf8-bom.csv都使用UTF-8、逗号和LF换行。后者只在开头多了EF BB BF三个字节。数据是教学虚构,英文版也保留相同姓名字符,便于逐字检查。

同时保留damaged-replacement.csv作为故障对照:其中一个姓名被人为替换为U+FFFD。不要将它当成待恢复的正确原件;它的用途是说明“程序能按UTF-8打开”不等于内容没有丢失。

两份正确CSV的完整正文

ID,Name,Amount
0007,上海,12.50
0008,Zoë,0.00
0009,東京,7.50
第一行为表头,3条记录。金额0是已知零,不是缺失;末尾有一个LF。

原始文件身份与解码结果
文件开头字节正确UTF-8解码后的表头
source-utf8.csv49 44 2CID,Name,Amount
source-utf8-bom.csvEF BB BF 49 44 2CID,Name,Amount
damaged-replacement.csv故意含替换字符的UTF-8正文表头正确仍不代表姓名正确

重开原件,显式选择UTF-8

Microsoft的UTF-8 CSV帮助建议:带BOM的UTF-8文件可正常打开;否则可通过数据获取中的文本/CSV导入或文本导入向导。菜单因版本和平台不同,若当前版本没有相同入口,先查该版本帮助,不要改文件扩展名来假装已经转码。

在Excel中保留原件,通过数据→从文本/CSV选择它;预览中确认文件来源为UTF-8、分隔符为逗号。需要保留编号时,进入转换步骤将ID设为文本;金额列才按数字处理。先看三种姓名和三列是否正确,再加载到新工作簿。本文不声称已在你使用的Excel版本上操作过。

需要浏览器本地交付XLSX时,可用CSV转Excel:选择正确原件,编码UTF-8、逗号、首行为表头;ID与Name保留文本,Amount设为数字,然后转换下载。它按选择的编码读取,不会判断未知文件到底来自哪种历史编码,也不会还原已经损坏的名字。

  1. 先用source-utf8.csv预览,核对含表头4行、3列,以及全部姓名。
  2. 将编号和姓名保持文本,只把Amount设为数字。
  3. 下载XLSX,再从磁盘重新打开,逐行对照下表。
  4. 换source-utf8-bom.csv重复同样设置;两份应得到相同的单元格内容,而非相同文件哈希。

验收看原文、类型与合计,不能只看一行

本例三条记录都很短,可以逐字核对。0007、0008和0009都必须保留4位;Zoë的最后一个字符是ë,不是e;上海和東京分别是两组汉字,不能只以“有中文显示”作为通过标准。

Amount以数字核算:12.50+0.00+7.50=20.00。XLSX的显示格式可能把12.50显示成12.5,这不等于数值变化;姓名字符、编号和数值应分别比较。对真实大文件,不能把本例逐行通过扩展成整批都已验证。

三条记录的参考答案
ID(文本)Name(文本)Amount(数字)
0007上海12.50
0008Zoë0.00
0009東京7.50

能读出的坏文件仍然可能无法恢复

故障状态

姓名已被另存为�;现在重新选择UTF-8,仍能正常打开文件。

正确动作

回到未被改写的原始导出,或请求发送方重新导出;保留这份坏文件供比较。

编码告诉程序怎样解释字节,不能从一个替换字符推断丢掉的原姓名。添加BOM也不会补回原字节。

把“重新解释”与“重新写入”分开

选错编码的预览若尚未保存,通常还可以用未改写的原件换一种正确编码再读;如果已经把错误显示重新编码保存,要比较更早备份,不能反复转来转去直到看着像人名。遇到实际GBK、UTF-16等文件,应向来源确认真实编码,本练习不替所有文件做自动识别。

当姓名正确而列或编号仍有问题时,继续按CSV列边界与类型指南处理。对方需要确认收到的是哪个原件时,按文件身份与SHA-256交接保存清单。带BOM与不带BOM的文件哈希不同,并不意味着两份表格的姓名和金额不同。

交付时写明UTF-8、是否有BOM、逗号、表头和应保留文本的ID列,并附3行/20.00的样本核对条件。CSV并不携带Excel单元格类型;以后再次导入,接收方仍需遵守这些条件。

常见问题

给所有CSV加BOM就能解决兼容问题吗?

不能。接收程序对BOM的处理不同,部分脚本会把它当成首列名的一部分。先用接收方的小样确认是否正确识别ID;若不支持BOM,就约定无BOM UTF-8并显式指定编码。分隔符、字段类型和已损坏的正文仍需另查。

参考资料与延伸阅读

按步骤开始处理

进入对应工具,预览处理结果,检查导出的文件。

继续阅读