编码转换(单个文件存在多种编码字符集)

编码转换(单个文件存在多种编码字符集)


文件中存在多行编码不一致的状况,这个时候对整个文件的编码转换报错致使的编码转换失败,这里作一个总结。html

 

 

文件示例

可能产生的缘由linux

 

文件存在编码不一致的行
文件存在编码不一致的行

 

此时文件内容shell

 

文件内容
文件内容

 

转换示例

文件中存在有些行使用的编码字符集不一致的状况,这个时候若是使用iconv直接对文件转换编码会报错。bash

 

报错信息
报错信息

 

  1. 若是能使用file命令直接查看出来文件的编码格式,经过iconv命令转换基本就不会报错了。
  2. 肯定某些行的格式,循环文件每行进行转换,对没法转换的行单独输出到一个文件中,而后再肯定没法转换的文件的格式。
# 指定须要转换的文件
export file="example";
# 抽取文件中的一行来肯定本行文件的编码
firstLine=`sed -n '1p' "${file}"`; for coded in `iconv --list | sed 's/\/\/$//' | sort`; do echo "${firstLine}" | iconv -f "${coded}" -t utf-8 && echo "${coded}:OK"; done | tee encoding.result;
  1. 此时去查看encoding.result中对文本第一行转换完成以后的文本编码。

 

第一行的编码
第一行的编码

 

  1. 经过上一行肯定的utf-8转换文件输出到succeed.result,而后转换失败的输出到fail.result(遍历文件每行转换)。
# 遍历文件每一行转换
while read line; do echo "${line}" | iconv -f utf-8 -t utf-8 >> succeed.result || echo "${line}" >> fail.result; done < ${file} &
  1. 转换完成以后(GBK等为GB8030子集的编码均可用GB18030转换)

 

转换完成以后
转换完成以后

 

  1. 对于大文件转换特别慢,能够用split切换为多个文件,对部分文件直接针对文件转换,失败的再使用遍历逐行转换。
# 定时查看文件是否转换完成一直转换以后的行数(PID替换为4步骤中的shell返回的pid)
watch -n 5 "ps -ef | grep -v grep | grep PID; [ -f succeed.result ] && wc succeed.result; [ -f fail.result ] && wc fail.result;";
相关文章
相关标签/搜索