編碼轉換(單個文件存在多種編碼字符集)


編碼轉換(單個文件存在多種編碼字符集)


文件中存在多行編碼不一致的情況,這個時候對整個文件的編碼轉換報錯導致的編碼轉換失敗,這里做一個總結。

 

 

文件示例

可能產生的原因

 

文件存在編碼不一致的行
文件存在編碼不一致的行

 

此時文件內容

 

文件內容
文件內容

 

轉換示例

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

 

報錯信息
報錯信息

 

  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;";


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM