Linux下如何将US-ASCII编码CSV转UTF-8?脚本转换失败求助
解决CSV文件编码转换为UTF-8的问题
问题分析
你的脚本存在两个核心问题:
- 使用的Perl编码转换命令未加载
Encode模块,导致转换逻辑根本无法执行 - 当文件内容全为ASCII字符时,
file -i会识别为us-ascii,但这类文件本身就是合法的UTF-8文件(UTF-8完全兼容ASCII)
解决方案
1. 修复Perl编码转换脚本
你的Perl命令缺少use Encode;声明,导致Encode::encode函数无法调用。修正后的完整脚本如下:
header="SourceFileIdentifier,Document Name,Number of pages,Page Number,Bank Name,Bank Address,Account Holder Name,Account Number,IBAN / BIC,Currency,Statement Number,Statement From Date,Statement To Date,Handwriting present,LineID,Date,Value,Reference,Description,Debit,Credit,Balance" while read -r series; do # 写入header并转码为UTF-8 echo "$header" | perl -MEncode -pe '$_ = Encode::encode("utf-8", $_)' > "${series}.csv" # 写入匹配的行并转码为UTF-8 grep "$series" sample.csv | perl -MEncode -pe '$_ = Encode::encode("utf-8", $_)' >> "${series}.csv" done < forty.csv
2. 理解file -i的判定逻辑
如果输出文件的所有字符都在ASCII范围内(0x00-0x7F),file -i会显示charset=us-ascii,但这完全符合UTF-8规范——UTF-8对ASCII字符的编码和ASCII完全一致,这类文件可以被任何UTF-8兼容的工具正常读取。
3. 强制让file识别为UTF-8(可选)
如果必须让file命令显示charset=utf-8,可以添加UTF-8 BOM(字节顺序标记),虽然CSV格式通常不推荐使用BOM,但部分Windows工具可能需要。修改脚本如下:
header="SourceFileIdentifier,Document Name,Number of pages,Page Number,Bank Name,Bank Address,Account Holder Name,Account Number,IBAN / BIC,Currency,Statement Number,Statement From Date,Statement To Date,Handwriting present,LineID,Date,Value,Reference,Description,Debit,Credit,Balance" # UTF-8 BOM的十六进制是EF BB BF utf8_bom=$(printf '\xef\xbb\xbf') while read -r series; do # 先写入BOM,再写入转码后的header echo -n "$utf8_bom" > "${series}.csv" echo "$header" | perl -MEncode -pe '$_ = Encode::encode("utf-8", $_)' >> "${series}.csv" # 写入匹配的行并转码为UTF-8 grep "$series" sample.csv | perl -MEncode -pe '$_ = Encode::encode("utf-8", $_)' >> "${series}.csv" done < forty.csv
4. 验证实际编码
用hexdump -C filename.csv查看文件:
- 如果是纯ASCII内容,每个字节都是0x00-0x7F,这就是合法的UTF-8
- 如果添加了BOM,文件开头会显示
ef bb bf三个字节,此时file -i会明确显示charset=utf-8
内容的提问来源于stack exchange,提问作者ROHAN
相关产品推荐
相关产品推荐

