公廁里的二進(jìn)制究竟寫的什么。。。
共 3066字,需瀏覽 7分鐘
·
2024-04-18 22:46
(關(guān)注數(shù)據(jù)結(jié)構(gòu)和算法,了解更多新知識(shí))
某公廁分別用中文,英文,日語和韓語寫了下面一段提示:向前一小步,文明一大步。這種提示在男廁所基本上是見怪不怪了,但關(guān)鍵是下面還有一段用0和1組成的數(shù)字,這又什么意思,難道是給外星人看的?
作為一個(gè)程序員能敏銳的感覺到這應(yīng)該就是上面中文的二進(jìn)制表示方式,于是我就嘗試著把它轉(zhuǎn)化為漢字,看看轉(zhuǎn)換之后對(duì)不對(duì)。
我們都知道漢字在計(jì)算機(jī)中存儲(chǔ)常見的編碼有GB2312,GBK,UTF-8,但仔細(xì)觀察上面的二進(jìn)制會(huì)發(fā)現(xiàn)很多地方出現(xiàn)了連續(xù)的3個(gè)1,所有大膽猜測(cè)應(yīng)該使用的是UTF-8編碼(當(dāng)然只是猜測(cè))。
猜完之后我們?cè)賮眚?yàn)證下,在驗(yàn)證之前我們先要了解下UTF-8的實(shí)現(xiàn)原理。UTF-8是一種可變長字符編碼,它可以用來表示Unicode標(biāo)準(zhǔn)中的任何字符,而且其編碼中的第一個(gè)字節(jié)仍與ASCII相容,使得原來處理ASCII字符的軟件無須或只進(jìn)行少部分修改后,便可繼續(xù)使用。
UTF-8通常使用1~4個(gè)字節(jié)表示字符,怎么確定一個(gè)字符占幾個(gè)字節(jié)呢?這就和二進(jìn)制的表示有關(guān),如果是一個(gè)字節(jié),那么最高位就是0,剩下的7個(gè)二進(jìn)制可以表示128個(gè)字符,這些字符對(duì)應(yīng)ASCII的128個(gè)字符。如果是兩個(gè)字節(jié)會(huì)以110開頭,三個(gè)字節(jié)是1110開頭……。
0xxxxxxx 一個(gè)字節(jié)110xxxxx 10xxxxxx 兩個(gè)字節(jié)1110xxxx 10xxxxxx 10xxxxxx 三個(gè)字節(jié)11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四個(gè)字節(jié)
private static void toChinese() {
String bits = "11100101100100001001000111100101100010011000110" +
"1111001001011100010000000111001011011000010001111111001" +
"10101011011010010100100000111001101001011010000111111001" +
"10100110001000111011100100101110001000000011100101101001" +
"0010100111111001101010110110100101";
int length = bits.length();
byte[] bytes = new byte[length >> 3];
for (int i = 0; i < length; i += 8) {
String byteString = bits.substring(i, i + 8);
bytes[i >> 3] = (byte) Integer.parseInt(byteString, 2);
}
System.out.println("轉(zhuǎn)換之后的結(jié)果:" + new String(bytes));
}
