天天看點

java删除utf-8的BOM空字元

java(安卓)删除移除清除utf-8的bom檔案頭空字元的代碼。近日寫一個安卓軟體,碰到了一個問題。在電腦上win7下建立一個txt檔案,裡面寫上"abc",不含雙引号。然後點選[檔案]-[另存為],在彈出的另存為對話框上找到編碼的選項,編碼設定為utf-8儲存。把這個utf-8格式的txt檔案拷貝到安卓手機上。

寫了一個安卓app用FileInputStream這個方法讀取txt内容。假設指派給字元串 str ,那麼str.length()正常情況下應該等于3對吧。其實不是,這裡卻等于4,即使用system.out.print()函數将str列印出來,肉眼可見的仍然隻有abc三個字元。其實這就是utf-8的bom檔案頭,有一個不可見的字元在abc的前面。這個字元不是空格,空格肉眼還可以分辨,但這個字元看上去就不存在。

解決辦法很簡單 1.不用代碼的方式:用winhex之類的十六進制編輯器打開這個txt檔案并删除開頭的“EF BB BF”.

2.用java代碼的方式,網上找了很多,有說用第三方庫的,有說删除首字元串的,都不靠譜。這麼簡單一個需求不至于再加載一個第三方庫呢。删除首字元也不可取,因為這個bom空字元可以存在于檔案頭,也可以存在于檔案中任何地方,不信你可以用十六進制編輯器把“EF BB BF”插入到檔案的任何地方(如果檔案含中文注意插入的時候别把中文的兩個位元組碼分開了,如果是英文無所謂),檔案都能正常打開且這個字元不可見,是以傻傻的删除首字元隻能解決部分問題。我們需要的是一個能删除所有bom的代碼,不僅限于檔案或字元串開頭。是以自己寫了如下代碼,親測可用!

public String shanchuUTF8bom(String s)  
    {
        char[] tmp=s.toCharArray();
        String xinstring="";
        for(char c:tmp)
        {
            if((int)c!=65279)
            {             
                xinstring=xinstring+c;
            }
        }
        return xinstring;
    }



//調用方法,例如需要删除bom空字元的字元串是 str 

str = shanchuUTF8bom(str)