字符编码指南
了解文件比较中常见的编码问题及解决方法。
什么是编码?
计算机将所有数据存储为二进制(0和1)。要在文本文件中保存一个字符,必须将该字符转换为特定的数字(字节值)。这种转换规则称为"编码(encoding)"。
同一个字符根据编码方式不同,存储为不同的字节值。例如,UTF-8中字符使用1-4个字节,而在旧编码中使用不同的字节映射。
如果使用错误的编码读取文件,字符会显示为乱码。这就是常见的"乱码"现象。
主要编码类型
UTF-8是目前使用最广泛的编码。它可以表示世界上所有语言的字符,超过95%的网站使用UTF-8。ASCII字符使用1字节,其他字符使用2-4字节。它是macOS和Linux的默认编码。
EUC-KR(CP949)是韩语专用编码。长期作为韩语Windows的默认编码。韩语字符使用2字节,英语使用1字节。
UTF-16是Windows内部使用的编码。所有字符用2或4字节表示。根据字节顺序,分为UTF-16LE(小端序)和UTF-16BE(大端序)。
ISO-8859-1(Latin-1)是西欧语言编码。用1字节表示256个字符。不能表示韩语或中文,但有时作为将二进制数据读取为文本时的后备方案。
DiffMate的自动编码检测
DiffMate打开文件时按以下顺序自动检测编码:
第1步 - BOM检查:检查文件开头是否存在BOM(字节顺序标记)。 UTF-8 BOM:0xEF 0xBB 0xBF UTF-16LE BOM:0xFF 0xFE UTF-16BE BOM:0xFE 0xFF
第2步 - 尝试UTF-8:如果没有BOM,首先尝试UTF-8解码。UTF-8在无效字节序列上会报错,所以成功意味着是UTF-8文件。
第3步 - 尝试EUC-KR:如果UTF-8失败,尝试EUC-KR(CP949)解码。大多数韩语文件在这一步成功。
第4步 - 后备:如果以上都失败,依次尝试ISO-8859-1、UTF-16LE和UTF-16BE。
这个过程是将Python后端的编码检测逻辑移植到浏览器端,使用TextDecoder API的fatal选项准确过滤错误编码。
如何解决编码问题
字符显示乱码时可以尝试的方法:
用记事本转换编码:在记事本中打开文件,选择"另存为"→选择"UTF-8"编码保存。这可以解决大多数编码问题。
用VS Code检查编码:在VS Code中打开文件时,底部状态栏会显示当前编码。点击它可以用不同编码重新打开或用不同编码保存。
在Linux/Mac上使用iconv:在终端中使用命令转换编码:iconv -f euc-kr -t utf-8 input.txt > output.txt
Excel CSV编码问题:在Excel中保存CSV时,选择"CSV UTF-8(逗号分隔)"以UTF-8格式保存。普通"CSV"以系统默认编码保存。
编码常见问题
Q:如何知道文件使用什么编码? A:大多数文本编辑器(VS Code、Notepad++等)打开文件时会在底部显示编码。或者在Linux/Mac上使用"file -i filename"命令。
Q:UTF-8和UTF-8 BOM有什么区别? A:UTF-8 BOM在文件开头添加3个字节(EF BB BF)。这些字节表示"此文件是UTF-8"。两种格式在大多数程序中都正常工作,但某些程序不识别BOM可能显示乱码。
Q:为什么相同内容的文件大小不同? A:不同编码对同一字符使用不同的字节数。韩语在UTF-8中使用3字节,EUC-KR中使用2字节。因此韩语较多的文件EUC-KR更小,英语较多的文件几乎相同。
Q:编码转换错误会导致数据丢失吗? A:可能。例如,如果将EUC-KR文件作为UTF-8读取并保存(未正确转换),韩语文本会损坏。转换前务必指定正确的源编码。