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

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


文件中存在多行編碼不一致的狀況,這個時候對整個文件的編碼轉換報錯致使的編碼轉換失敗,這裏作一個總結。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;";
相關文章
相關標籤/搜索