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 进行授权