編碼轉換(單個文件存在多種編碼字符集)
文件中存在多行編碼不一致的情況,這個時候對整個文件的編碼轉換報錯導致的編碼轉換失敗,這里做一個總結。
文件示例
可能產生的原因

文件存在編碼不一致的行
此時文件內容

文件內容
轉換示例
文件中存在有些行使用的編碼字符集不一致的情況,這個時候如果使用iconv直接對文件轉換編碼會報錯。

報錯信息
- 如果能使用file命令直接查看出來文件的編碼格式,通過iconv命令轉換基本就不會報錯了。
- 確定某些行的格式,循環文件每行進行轉換,對無法轉換的行單獨輸出到一個文件中,然后再確定無法轉換的文件的格式。
# 指定需要轉換的文件
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;
- 此時去查看encoding.result中對文本第一行轉換完成之后的文本編碼。

第一行的編碼
- 通過上一行確定的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} &
- 轉換完成之后(GBK等為GB8030子集的編碼都可用GB18030轉換)

轉換完成之后
- 對於大文件轉換特別慢,可以用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;";