1. 程式人生 > >linux 批量轉換UTF8到GB2312並處理UTF8的BOM標記

linux 批量轉換UTF8到GB2312並處理UTF8的BOM標記

背景

本人在使用oracle的sqlplus批量匯入UTF8編碼的sql指令碼時,由於不瞭解如何設定讓sqlplus識別UTF8格式,導致出現亂碼、錯行等錯誤,而使工作無法繼續,在google無果的情況下只好想辦法轉換編碼。

由於檔案較多,手動轉換太麻煩,於是想到用指令碼批量轉換,幸好網上相關指令碼比較多,實現起來唯一的麻煩是UTF8的BOM標記。

下面指令碼經本人測試可以工作,歡迎高手留言指正

內容

  1. #!/bin/bash  
  2. for loop in `find . -type f -name "*.sql" -print`  
  3. do  
  4.     echo $loop  
  5.     mv -f $loop $loop.tmp  
  6.     dos2unix $loop.tmp  
  7.     file_check_utf8='file_check_utf8.log'  
  8.     sed -n '1l' $loop.tmp >$file_check_utf8  
  9.     if grep '^\\357\\273\\277' $file_check_utf8 >/dev/null 2>&1  
  10.     then  
  11.         echo 'UTF-8 BOM'  
  12.         sed -n -e '1s/^...//' -e 'w intermediate.txt' $loop.tmp  
  13.         iconv -f UTF-8 -t GB2312 -o $loop intermediate.txt  
  14.         rm -rf intermediate.txt  
  15.         rm -rf $loop.tmp  
  16.     elif iconv -f UTF-8 -t GB2312 $loop.tmp >/dev/null 2>&1  
  17.     then  
  18.         echo 'UTF-8'  
  19.         iconv -f UTF-8 -t GB2312 -o $loop $loop.tmp  
  20.         rm -rf $loop.tmp  
  21.     else  
  22.         echo 'ANSI'  
  23.         mv -f $loop.tmp $loop  
  24.     fi  
  25.     rm -rf $file_check_utf8  
  26.     #模擬unix2dos,要求文字檔案最後一行必須有換行符  
  27.     sed -n -e 's/$/\r/g' -e 'w '$loop.tmp $loop  
  28.     mv -f $loop.tmp $loop  
  29. done  

解釋

  1. 處理UTF8的BOM,本人沒有找到好的辦法,最後用sed+grep判斷了一下,如果前三個位元組是\\357\\273\\277,則檔案必定是UTF8,用sed去掉這三個位元組再轉換
  2. 為了避免重複或者遺漏,指令碼中用iconv對沒有BOM的檔案嘗試轉換了一把,轉換成功說明檔案是UTF8,否則說明是ANSI也就是GB2312
  3. 關於最後的sed命令,那是因為本人的系統上沒有unix2dos命令,所以進行了模擬,目的是為了方便自己在windows下檢視和編輯

問題

  1. 如果有高手知道如何設定sqlplus,能夠讓sqlplus直接匯入UTF8檔案,還望不吝留言告知
  2. 關於如何去掉UTF8前三個位元組的BOM,如果各位高手有更好更簡單的辦法,也歡迎留言

謝謝!