問(wèn)題:理論是2字節(jié)(漢字 字母)苛骨。UTF-8時(shí)new String("字").getBytes().length 返回3
一篱瞎、R大回答:
分清楚內(nèi)碼(internal encoding)苟呐、外碼(external encoding)
內(nèi)碼:程序內(nèi)部用的字符編碼,實(shí)現(xiàn)char俐筋、String類(lèi)型內(nèi)存里用內(nèi)部編碼牵素;
? ? ? ? ? ?規(guī)定內(nèi)碼UTF-16⌒0ィ或讓用戶(hù)無(wú)感知到String用非UTF-16
外碼:程序與外部交互用字符編碼两波。不是內(nèi)存用都是“外部”。如闷哆,序列化后char或String腰奋,或外部文件、命令行參數(shù)抱怔。
? ? ? ? ? ?規(guī)定外碼UTF-8劣坊。Class的字符串常量、符號(hào)名字也是屈留。為了平衡運(yùn)行時(shí)的時(shí)間效率(定長(zhǎng)UTF-16)與外部存儲(chǔ)空間效率(變長(zhǎng)UTF-8)做取舍局冰。
Java語(yǔ)言規(guī)范規(guī)定,char是UTF-16的code unit灌危,也就是一定是16位(2字節(jié))康二;
答:String.getBytes():內(nèi)碼轉(zhuǎn)指定外碼。外碼UTF-8勇蝙,得到byte[]外碼性質(zhì)
題外話:
(1)JavaScript用UTF-16作為內(nèi)碼沫勿,“壓縮字符串”用ASCII內(nèi)碼字符串,用戶(hù)只能看到UTF-16 code unit味混。
(2)UTF-16:大部分定長(zhǎng)2字節(jié)产雹,偶爾4,無(wú)法兼容于ASCII編碼
二翁锡、回答:脫離具體編碼談某個(gè)字符占幾個(gè)字節(jié)蔓挖,沒(méi)意義
1、同一個(gè)字符 不同編碼馆衔,占不同字節(jié)
(1)抽象整數(shù)“42”占幾個(gè)字節(jié)瘟判?
byte 存 1 字節(jié)(有限位數(shù),256 無(wú)法存)哈踱,short 2荒适,int 4,long 8 字節(jié)
“字”GBK 2 开镣,UTF-16? 2 刀诬,UTF-8? 3,UTF-32? 4 字節(jié)
2、不同字符陕壹,同編碼下质欲,占不同字節(jié)
UTF-8?變長(zhǎng):“字”3字節(jié),“A” 1 字節(jié)糠馆。
new String("字").getBytes("GBK").length ”嘶伟,返回2