getBytes 實(shí)際是做編碼轉(zhuǎn)換恒傻,你應(yīng)該顯式傳入一個(gè)參數(shù)來(lái)指定編碼,否則它會(huì)使用缺省編碼來(lái)轉(zhuǎn)換建邓。
你說(shuō)“ new String("字").getBytes().length 返回的是3 ”盈厘,這說(shuō)明缺省編碼是 UTF-8.如果你顯式地傳入一個(gè)參數(shù),比如這樣“ new String("字").getBytes("GBK").length ”官边,那么返回就是 2.
你可以在啟動(dòng) JVM 時(shí)設(shè)置一個(gè)缺省編碼沸手,
假設(shè)你的類(lèi)叫 Main外遇,那么在命令行中用 java 執(zhí)行這個(gè)類(lèi)時(shí)可以通過(guò) file.encoding 參數(shù)設(shè)置一個(gè)缺省編碼。比如這樣:java -Dfile.encoding=GBKMain這時(shí)契吉,你再執(zhí)行不帶參數(shù)的 getBytes() 方法時(shí)跳仿,new String("字").getBytes().length 返回的就是 2 了,因?yàn)楝F(xiàn)在缺省編碼變成 GBK 了捐晶。當(dāng)然菲语,如果這時(shí)你顯式地指定編碼,new String("字").getBytes("UTF-8").length 返回的則依舊是 3.
否則租悄,會(huì)使用所在操作系統(tǒng)環(huán)境下的缺省編碼谨究。
通常,Windows 系統(tǒng)下是 GBK泣棋,Linux 和 Mac 是 UTF-8.但有一點(diǎn)要注意胶哲,在 Windows 下使用 IDE 來(lái)運(yùn)行時(shí),比如 Eclipse潭辈,如果你的工程的缺省編碼是 UTF-8鸯屿,在 IDE 中運(yùn)行你的程序時(shí),會(huì)加上上述的 -Dfile.encoding=UTF-8?參數(shù)把敢,這時(shí)寄摆,即便你在 Windows 下,缺省編碼也是 UTF-8修赞,而不是 GBK婶恼。
由于受啟動(dòng)參數(shù)及所在操作系統(tǒng)環(huán)境的影響,不帶參數(shù)的 getBytes 方法通常是不建議使用的柏副,最好是顯式地指定參數(shù)以此獲得穩(wěn)定的預(yù)期行為勾邦。