文章

rust utf8 和 ascii

rust utf8 和 ascii

存储字节数组(u8)数组时,涉及到的一些字符存储格式记录

说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#[cfg(test)]
mod test {
    #[test]
    pub fn test_character_encode() {
        /*
         * char 类型占据 4 个字节,支持所有的 Unicode 字符
         * u8 类型占据 1 个字节,适用于所有的 ASCII 字符
         */

        // 创建 1 个字节字符串字面量
        let str_1: &[u8; 4] = b"abcd";
        // 由于 str_1 仅包含 ASCII 字符,rust 会把这些字符视为它们对应的字节值
        assert_eq!(*str_1, [97, 98, 99, 100]);

        // 把 1 个 ASCII 字符转换为 UTF-8 编码, ASCII 只会占用 1 个字节
        let char_a: char = 'a';
        let mut char_buffer: [u8; 4] = [0u8; 4];
        let size: usize = char_a.encode_utf8(&mut char_buffer).len();
        assert_eq!(char_buffer[0..size], [97]);

        // 把 1 个中文字符(非 ASCII 字符)转换为 UTF-8 编码, 会占用 2~4 个字节
        let char_b: char = '哈';
        let mut char_buffer_b: [u8; 4] = [0u8; 4];
        let size_b: usize = char_b.encode_utf8(&mut char_buffer_b).len();
        assert_eq!(char_buffer_b[0..size_b], [229, 147, 136]);

        // Syntax Error: Byte literals must not contain non-ASCII characters
        // let str_2 = b"abc哈d";
        let str_2: &[u8; 7] = b"abc\xE5\x93\x88d";
        assert_eq!(*str_2, [97, 98, 99, 229, 147, 136, 100]);
    }
}

本文由作者按照 CC BY 4.0 进行授权