一、理論說明 UTF-8 是一個非常驚艷的編碼方式,漂亮的實現(xiàn)了對 ASCII 碼的向后兼容,以保證 Unicode 可以被大眾接受。 UTF-8 是目前互聯(lián)網(wǎng)上使用最廣泛的一種 Unicode 編碼方式,它的最大特點就是可變長。它可以使用 1 - 4 個字節(jié)表示一個字符,根據(jù)字符的不同變換長度。編碼規(guī)則如下: 對于單個字節(jié)的字符,第一位設為 0,后面的 7 位對應這個字符的 Unicode 碼點。因此,對于英文中的 0 - 127 號字符,與 ASCII 碼完全相同。這意味著 ASCII 碼那個年代的文檔用 UTF-8 編碼打開完全沒有問題。 對于需要使用 N 個字節(jié)來表示的字符(N > 1),第一個字節(jié)的前 N 位都設為 1,第 N + 1 位設為0,剩余的 N - 1 個字節(jié)的前兩位都設位 10,剩下的二進制位則使用這個字符的 Unicode 碼點來填充。 編碼規(guī)則如下: 根據(jù)上面編碼規(guī)則對照表,進行 UTF-8 編碼和解碼就簡單多了。下面以漢字“漢”為利,具體說明如何進行 UTF-8 編碼和解碼。 “漢”的 Unicode 碼點是 0x6c49(110 1100 0100 1001),通過上面的對照表可以發(fā)現(xiàn),0x0000 6c49 位于第三行的范圍,那么得出其格式為 1110xxxx 10xxxxxx 10xxxxxx。接著,從“漢”的二進制數(shù)最后一位開始,從后向前依次填充對應格式中的 x,多出的 x 用 0 補上。這樣,就得到了“漢”的 UTF-8 編碼為 11100110 10110001 10001001,轉換成十六進制就是 0xE6 0xB7 0x89。 解碼的過程也十分簡單:如果一個字節(jié)的第一位是 0 ,則說明這個字節(jié)對應一個字符;如果一個字節(jié)的第一位1,那么連續(xù)有多少個 1,就表示該字符占用多少個字節(jié)。 二、代碼 println!("unicode碼:"); let ch ='漢' as i32;// unicode 碼 let ch_unicode = format!("{:X}",ch); println!("ch:{:?}",ch_unicode); println!("字節(jié)碼和二進制代碼:"); let my_char = "漢".as_bytes(); let len = my_char.len(); for i in 0..len{ println!("bytes[{:?}]:?],{:?}",i,&my_char[i]); let bit_char= format!("{:b}",my_char[i]); println!("i :{:?} ,bit_char :{:?}",i,bit_char); } output: unicode碼: ch:"6C49" 字節(jié)碼和二進制代碼: bytes[0]:?],230 i :0 ,bit_char :"11100110" bytes[1]:?],177 i :1 ,bit_char :"10110001" bytes[2]:?],137 i :2 ,bit_char :"10001001" |
|