1 use lib::*; 2 3 const TAG_CONT: u8 = 0b1000_0000; 4 const TAG_TWO_B: u8 = 0b1100_0000; 5 const TAG_THREE_B: u8 = 0b1110_0000; 6 const TAG_FOUR_B: u8 = 0b1111_0000; 7 const MAX_ONE_B: u32 = 0x80; 8 const MAX_TWO_B: u32 = 0x800; 9 const MAX_THREE_B: u32 = 0x10000; 10 11 #[inline] encode(c: char) -> Encode12pub fn encode(c: char) -> Encode { 13 let code = c as u32; 14 let mut buf = [0; 4]; 15 let pos = if code < MAX_ONE_B { 16 buf[3] = code as u8; 17 3 18 } else if code < MAX_TWO_B { 19 buf[2] = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; 20 buf[3] = (code & 0x3F) as u8 | TAG_CONT; 21 2 22 } else if code < MAX_THREE_B { 23 buf[1] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; 24 buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT; 25 buf[3] = (code & 0x3F) as u8 | TAG_CONT; 26 1 27 } else { 28 buf[0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; 29 buf[1] = (code >> 12 & 0x3F) as u8 | TAG_CONT; 30 buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT; 31 buf[3] = (code & 0x3F) as u8 | TAG_CONT; 32 0 33 }; 34 Encode { buf: buf, pos: pos } 35 } 36 37 pub struct Encode { 38 buf: [u8; 4], 39 pos: usize, 40 } 41 42 impl Encode { as_str(&self) -> &str43 pub fn as_str(&self) -> &str { 44 str::from_utf8(&self.buf[self.pos..]).unwrap() 45 } 46 } 47