UTF-8帶BOM和不帶BOM的轉換


UTF-8帶BOM和不帶BOM的轉換

標簽:Linux UTF-8 BOM


【問題】

在linux下如果你使用過的編碼不是utf-8你可以使用enca進行轉換,然而轉換過后的情況是不帶bom的uft-8,在windos下我們的編譯器采用了msvc2015,而msvc2015不能很好的識別不帶bom的utf-8,搞得每次都得使用notepad++打開然后再進行編碼轉換,可是文件千千萬萬個...

【分析問題】

根據上面的情況,我們可以將這個問題分為兩個子問題進行解決:
問題1.UTF-8帶BOM和不帶BOM有什么區別?
問題2.UTF-8帶BOM和不帶BOM的轉化?

【解決-問題1:UTF-8帶BOM和不帶BOM有什么區別?】

(1)打開notepad++,輸入123
(2)菜單欄選擇 編碼-轉為UTF-8無BOM編碼格式並進行保存
(3)菜單欄選擇 插件-HEX-Editor-view in HEX (關於插件HEX-Editor的安裝可以直接使用插件管理進行安裝,unix下面可以直接使用xxd查看)
(4)可以看到
no_bom.png

(5)退出view in HEX
(6)菜單欄選擇 編碼-轉為UTF-8編碼格式並進行保存
(7)重復步驟(3)(4)可以看到
bom.png
Ok,這就知道它們在編碼的區別了,理論上的區別呢? 請進行移步到:https://en.wikipedia.org/wiki/Byte_order_mark 進行查看.

【解決-UTF-8帶BOM和不帶BOM的轉化?】

廢話不多說,利用Linux(筆者此處測試的環境為:Ubuntu12.04)的主要代碼如下:

#clear bom
sed -i  '1s/^\xef\xbb\xbf//' “$你的輸入文件,如:mian.cpp”

#add bom
sed -I  '1s/^/\xef\xbb\xbf&/' “$你的輸入文件,如:mian.cpp”

筆者為了處理一個文件夾下面的代碼源文件(.cpp,.h)用了一個函數,當然你也可以直接使用find.

完整代碼如下:

#!/bin/bash
add_bom()
{
    for i in `ls $1`
    do
        current_path=$1/$i
        if [ -d $current_path ]   
        then
            change_code $current_path
        else
          if [ "${current_path##*.}" = "cpp" ] || [ "${current_path##*.}" = "h" ];then
               #clear bom
               sed -i  '1s/^\xef\xbb\xbf//' $current_path

               #add bom
               sed -I  '1s/^/\xef\xbb\xbf&/' $current_path
          fi
        fi
    done
}

current=`pwd`
add_bom $current

至此完成,關於直接采用find,待后續有需要再進行補充吧。


免責聲明!

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



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