linux 批量轉換UTF8到GB2312並處理UTF8的BOM標記
阿新 • • 發佈:2019-02-02
背景
本人在使用oracle的sqlplus批量匯入UTF8編碼的sql指令碼時,由於不瞭解如何設定讓sqlplus識別UTF8格式,導致出現亂碼、錯行等錯誤,而使工作無法繼續,在google無果的情況下只好想辦法轉換編碼。
由於檔案較多,手動轉換太麻煩,於是想到用指令碼批量轉換,幸好網上相關指令碼比較多,實現起來唯一的麻煩是UTF8的BOM標記。
下面指令碼經本人測試可以工作,歡迎高手留言指正
內容
- #!/bin/bash
- for loop in `find . -type f -name "*.sql" -print`
- do
- echo $loop
- mv -f $loop $loop.tmp
- dos2unix $loop.tmp
- file_check_utf8='file_check_utf8.log'
- sed -n '1l' $loop.tmp >$file_check_utf8
- if grep '^\\357\\273\\277' $file_check_utf8 >/dev/null 2>&1
- then
- echo 'UTF-8 BOM'
- sed -n -e '1s/^...//' -e 'w intermediate.txt' $loop.tmp
- iconv -f UTF-8 -t GB2312 -o $loop intermediate.txt
- rm -rf intermediate.txt
- rm -rf $loop.tmp
- elif iconv -f UTF-8 -t GB2312 $loop.tmp >/dev/null 2>&1
- then
- echo 'UTF-8'
- iconv -f UTF-8 -t GB2312 -o $loop $loop.tmp
- rm -rf $loop.tmp
- else
- echo 'ANSI'
- mv -f $loop.tmp $loop
- fi
- rm -rf $file_check_utf8
- #模擬unix2dos,要求文字檔案最後一行必須有換行符
- sed -n -e 's/$/\r/g' -e 'w '$loop.tmp $loop
- mv -f $loop.tmp $loop
- done
解釋
- 處理UTF8的BOM,本人沒有找到好的辦法,最後用sed+grep判斷了一下,如果前三個位元組是\\357\\273\\277,則檔案必定是UTF8,用sed去掉這三個位元組再轉換
- 為了避免重複或者遺漏,指令碼中用iconv對沒有BOM的檔案嘗試轉換了一把,轉換成功說明檔案是UTF8,否則說明是ANSI也就是GB2312
- 關於最後的sed命令,那是因為本人的系統上沒有unix2dos命令,所以進行了模擬,目的是為了方便自己在windows下檢視和編輯
問題
- 如果有高手知道如何設定sqlplus,能夠讓sqlplus直接匯入UTF8檔案,還望不吝留言告知
- 關於如何去掉UTF8前三個位元組的BOM,如果各位高手有更好更簡單的辦法,也歡迎留言