小白們?cè)诓煌脚_(tái)上使用String.getBytes()吕粗,會(huì)發(fā)現(xiàn)同樣的字符得到的字節(jié)數(shù)組不同樣纺荧。明顯這是依賴于平臺(tái)的默認(rèn)字符集。
這可以從源碼注釋中得知:其中颅筋,默認(rèn)的charset是Charset.defaultCharset()
其實(shí)Charset.defaultCharset()是受到 jvm參數(shù) -Dfile.encoding=UTF-8 的影響宙暇。在啟動(dòng)jvm時(shí)如果沒(méi)有指定編碼,那么就以平臺(tái)默認(rèn)編碼议泵。因而占贫,在大部分windows系統(tǒng),我們ANSI 是GBK 先口,所以getBytes()的結(jié)果是GBK格式型奥。
我們來(lái)做個(gè)實(shí)驗(yàn)即可明了:
1) 在IDE中,例如IDEAJ中碉京,如果我們沒(méi)有指定file.encoding的值厢汹,那么IDE默認(rèn)會(huì)“偷偷”給我們?cè)O(shè)置為UTF-8:
如果我們需要指定,則在這里修改即可:
2)不在IDE中的情況谐宙。沒(méi)有IDE的“偷雞摸狗”行為烫葬,如果我們沒(méi)有指定,則默認(rèn)按照操作系統(tǒng)的ANSI 編碼凡蜻。
如果我們手動(dòng)指定了file.encoding參數(shù)搭综,那么也會(huì)輸出結(jié)果也會(huì)改變:
總結(jié):
由上面,我們可以看到getBytes() 其實(shí)是受到很多因素影響的咽瓷。為了提高可控性设凹,我不建議大家直接用getBytes(),而是每次都手動(dòng)指定編碼:getBytes("****")茅姜,這樣才不會(huì)受操作系統(tǒng)等因素影響闪朱。(畢竟亂碼問(wèn)題往往涉及因素、環(huán)節(jié)較多钻洒,排查起來(lái)會(huì)有點(diǎn)困難)
注意:很多人在這里又容易混淆奋姿,誤以為JVM中字符內(nèi)碼 也變成 -Dfile.encoding指定編碼格式了。這是錯(cuò)誤的素标,也是容易混淆的称诗。一定要記住:JVM中字符內(nèi)碼只會(huì)是UTF-16格式M吩狻寓免!-Dfile.encoding指定編碼格式是在平時(shí)轉(zhuǎn)化成字節(jié)數(shù)組癣诱、IO流處理等才起作用。