数据和电子表格 · CSV 清理器
UTF-8 和 Windows-1252 如何感到困惑:修复 Mojibake CSV 导出
· 工作原理
csv 编码 数据清理
当“José”变成“José”时,字节是正确的,但解释是错误的。这篇文章解释了两种最常见的编码如何冲突、如何识别症状以及如何重新解码修复它们。
重音名称和大引号变成了符号汤 - UTF-8 文件的泄露模式读作 Windows-1252,反之亦然
加载后成为替换钻石的客户名称并不能证明 CSV Cleaner 检测到错误的旧代码页。配置的说法相反:仅理解 UTF-8,而 Windows-1252 或 Shift-JIS 文件被读取为 UTF-8。因此,在 CSV 解析器看到字符之前,无效的字节序列就已经被替换。
大纲以熟悉的 mojibake(如 José)为中心,但浏览器读取路径使用 `File.text()` 并且不提供编码选择器。本文纠正了这一承诺。该工具中可操作的症状是替换字符或以其他方式损坏的文本,并保留原始文件字节以便在其他地方恢复。
非 UTF-8 文件作为替换字符到达此工具,而不是经过验证的 mojibake 模式
分隔文件是磁盘上的字节,而解析器则对 JavaScript 字符串进行操作。编码定义了这些层之间的映射。 CSV 语法命名逗号、引号和记录边界,但没有可靠的磁盘声明告诉 `File.text()` 哪个旧映射创建了每个非 ASCII 字节。
一旦解码产生 U+FFFD 替换字符,后面的 CSV 操作就会将这些占位符作为普通文本接收。修剪或导出无法推断哪个原始字节序列或字符属于那里。这就是为什么未触及的源比从损坏的显示器中组装的查找和替换列表更重要。
两个常见的嫌疑人 — UTF-8 的多字节序列和 Windows-1252 的单字节,以及为什么它们在交换时会产生可预测的垃圾
UTF-8 表示具有多字节序列的非 ASCII 字符。 Windows-1252 将许多西方字符分配给各个字节值。阅读一种约定下的另一种约定可能会失败或产生误导性文本,但此路线不会测试替代解码器、对合理的语言进行评分或提供 Windows-1252 选择。
唯一特定于编码的解析器行为是在文本解码后删除前导 U+FEFF UTF-8 字节顺序标记。这可以防止标记加入第一个标头。它不是一般的编码检测,并且不提供对 Shift-JIS、UTF-16 或实现中未提及的区域代码页的支持。
ToolAcre 接受 UTF-8 文本,并且不比较 Windows-1252 候选者
替换字符表示文本解码器无法在其选择的解释下映射某些输入字节。问号可能是由之前的有损导出插入的,在这种情况下,原始字符可能已经不可用。可识别的 à 序列可能会出现在其他工作流程中,但此页面不会诊断其历史记录。
不要仅从一个姓氏来决定源编码。检查导出应用程序的设置、文件来源和字节感知检查器,使源保持不变。清理器的行警告涉及引用闭合和列宽度;它们并不是字符编码正确的证据。
重新解码,而不是查找和替换 - 为什么修复方法是使用正确的编码读取字节并写入 UTF-8,而不是一一修补字符
可靠的修复是返回原始字节并使用记录的源编码对其进行一次解码,然后写入 UTF-8。该操作必须在通过仅限 UTF-8 的文本路径打开之前进行。解码后替换可见的垃圾片段可能会破坏合法的出现,并且无法区分折叠为一个占位符的多个原始字符。
CSV Cleaner 没有字节级重新解码控制,因此它无法执行轮廓所承诺的转换。使用可信的源感知转换方法,将代表性名称与源系统进行比较,然后将 UTF-8 结果带至此处以进行分隔符、引用、空格和重复工作。
从此工具外部恢复原始字节;此处的字符替换无法恢复它们
为了安全演示,请创建一个包含一个重音名称的小型旧编码文件并保留一个十六进制副本。加载到工具中,观察是否出现替换字符。该观察建立了 UTF-8 边界;它不会仅仅因为预期的名称已知而建立原始代码页。
接下来使用 ToolAcre 外部显式选择的解码器转换未触及的字节,保存 UTF-8 并加载该结果。现在,名称应该完好无损地到达,而 CSV 解析器正常处理分隔符。比较这两条路径可以提供正确的教训,而无需声称清洁工自己执行了恢复。
工作示例:演示 UTF-8 边界,无需声明不受支持的修复
双编码文件可能需要重建早期的转换,并且如果没有其他来源,已经用文字问号保存的数据可能无法恢复。本文没有规定通用反转,因为该实现不包含编码历史或字节保留恢复功能。
它还避免声称支持 UTF-16、东亚编码或规范化形式。如果这些很重要,请选择一个能够命名并测试它们的转换器。成功的 CSV 解析仅证明分隔符状态机找到了行;它没有说明该阶段之前的字符解码是否忠实。
修复一次解释 — ToolAcre CSV Cleaner 的编码修复如何在设备上重新解码和重新编码导出
ToolAcre 可以剥离前导 UTF-8 BOM,并通过浏览器的下载路径将结果字符串序列化为 UTF-8 CSV。它无法将任意旧字节转换为正确的 Unicode,因为在没有用户选择的解码器的情况下,这些字节已经跨越了浏览器的固定文本读取边界。
将替换标记视为停止信号。保留源代码,从生产者处识别其编码,使用适当的字节感知工具转换一次,并验证重要名称。只有这样才能使用 CSV Cleaner 来完成其配置实际承诺的结构作业。