1. 下表為UTF-8編碼規(guī)則表
2. 上述很重要的一個(gè)信息是下一個(gè)的first code point是接著上一個(gè)的last code point的,因此utf-8有一些看似合乎規(guī)則的編碼也無法轉(zhuǎn)化,譬如11000000 10000001蟹肘,雖然符合雙字節(jié)的規(guī)則,但其剩余的二進(jìn)制表示的值小于128作喘,所以無效【之前一直以為是移位規(guī)則之類的轻纪,會(huì)自動(dòng)+128這樣】
3. 這個(gè)常見的亂碼符號(hào)是utf-8編碼錯(cuò)誤時(shí)產(chǎn)生的,對(duì)應(yīng)的二進(jìn)制數(shù)為11101111 10111111 10111101催植,共三個(gè)字節(jié)肮蛹,每當(dāng)utf-8編碼錯(cuò)誤時(shí)【不符合上表的規(guī)則】,每一個(gè)字節(jié)都會(huì)對(duì)應(yīng)轉(zhuǎn)化成三個(gè)字節(jié)的這個(gè)亂碼符號(hào)创南,譬如執(zhí)行
? ? byte[] bBytes = new byte[20];
? ? bBytes[0] = (byte) 0b11000000;
? ? bBytes[1] = (byte) 0b10000001;
? ? System.out.println(new String(bBytes, StandardCharsets.UTF_8));
會(huì)得到兩個(gè)如下的亂碼符號(hào)
也正因?yàn)槿绱寺字遥?dāng)你得到一串亂碼字符時(shí),可通過減去兩倍亂碼字符數(shù)來得到原字節(jié)數(shù)