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)可以看到
(5)退出view in HEX
(6)菜單欄選擇 編碼-轉為UTF-8編碼格式並進行保存
(7)重復步驟(3)(4)可以看到
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,待后續有需要再進行補充吧。