15 - 字符串与文本
15.1-Unicode
15.1.1-ASCII、Latin-1 与 Unicode
-
Unicode 与 ASCII 的所有 ASCII 码点都相同(0 ~ 0x7f)。
-
Unicode 将(0 ~ 0x7f)码点范围称为 Latin-1 编码块(
ISO/IEC 8859-1)。 -
即 Unicode 是 Latin-1 的超集:
-
Latin-1 转换为 Unicode:
fn latin1_to_char(latin1: u8) -> char { latin1 as char } -
Unicode 转换为 Latin-1:
fn char_to_latin1(c: char) -> Option<u8> { if c as u32 <= 0xff { Some(c as u8) } else { None } }
-
15.1.2-UTF-8
- Rust 的
String和str类型使用 UTF-8 编码格式表示文本。UTF-8 将字符编码为 1 到 4 个字节序列。 - UTF-8 序列的格式限制:
- 对于给定的码点,只有最短的编码才被认为是格式良好的,即不能用 4 个字节去编码只需 3 个字节的码点。
- 格式良好的 UTF-8 不能对 0xd800 ~ 0xdfff,以及大于 0x10ffff 的数值编码。
- UTF-8 的重要属性:
- UTF-8 对码点 0 到 0x7f 的编码就是字节 0 到 0x7f,保存 ASCII 文本的字节是最有效的 UTF-8。ASCII 与 UTF-8 是可逆的,而 Latin-1 与 UTF-8 不具备可逆性。
- 通过观察任意字节的前几位,就能知道它是某些字符 UTF-8 编码的首字节,还是中间字节。
- 通过编码首字节的前几位就能知道编码的总长度。
- 编码最长为 4 个字节,UTF-8 不需要无限循环,可用于处理不受信的数据。
- 格式良好的 UTF-8 种,可以快速指出字符编码的起始和结束位置。UTF-8 的首字节与后续字节有明显区别。
15.1.5 - 文本方向性
- 有些文字是从左向右书写:属于正常情况下的书写或阅读方式,也是 Unicode 采用的顺序存储字符。
- 有些文字是从右向左书写:字符串的首字节保存的是要写在最右边的字符的编码。
15.2 - 字符(char)
char类型是保存 Unicode 码点的 32 位值。- 范围为:0 到 0xd7ff,或者 0xe000 到 0x10ffff。
char类型实现了Copy和Clone,以及比较、散列、格式的所有常用特型。
15.2.1 - 字符分类 —— 检测字符类别的方法
ch.is_numeric():数值字符,包括 Unicode 普通类别Number; digit和Number; letter,但不包括Number; other。ch.is_alphabetic():字母字符,包括 Unicode 的 “Alphabetic” 派生属性。ch.is_alphanumeric():数值或字母字符,包括上面两个类别。ch.is_whitespace():空白字符,包括 Unicode 字符属性 “WSpace=Y”。ch.is_control:控制字符,包括 Unicode 的Other, control普通类别。
15.2.2 - 处理数字
ch.to_digit(radix):决定ch是否是基数为radix的 ASCII 数字。如果是就返回Some(num),其中num是u32。否则,返回None。radix的范围是 2~36。如果radix > 10,那么 ASCII 字母将作为值为 10~35 的数字。std::char::from_digit(num, radix):把u32数值num转换为char。如果radix > 10,ch是小写字母。ch.is_digit(radix):在ch是基数为radix下的 ASCII 数字时,返回true。等价于ch.to_digit(radix) != None。
15.2.3 - 字符大小写转换
ch.is_lowercase():判断ch是否为小写字母。ch.is_uppercase():判断ch是否为大写字母。ch.to_lowercase():将ch转换为小写字母。ch.to_uppercase():将ch转换为大写字母。
15.2.4 - 与整数相互转换
as操作符可以把char转换为任何整数类型,高位会被屏蔽。as操作符可以把任何u8值转换为char。char类型也实现了From<u8>。推荐使用std::char::from_u32,返回Option<char>。
15.3-String 与 str
-
Rust 的
String和str类型只保存格式良好的 UTF-8。 -
String类型能创建可伸缩缓冲区,用于保存字符串。本质为Vec<u8>的包装类型。 -
str类型则就地操作字符串文本。 -
String的解引用为&str。str上定义的所有方法,都可以在String上直接调用。 -
文本处理的方法按照字节偏移量来索引文本,也按字节来度量长度,并不是按照字符。
-
Rust 会根据变量的名称,推测其类型,如:
变量名 推测类型 stringStringslice&str或解引用为&str的类型,如String或Rc<String>chcharnusize,长度i, jusize,字节偏移量rangeusize字节偏移量范围,可能是全限定i..j,部分限定i..或..j,或无限定..pattern任意模式类型: char, String, &str, &[char], FnMut(char) -> bool
15.3.1 - 创建 String 值
-
String::new():返回全新的空字符串。没有分配在堆上的缓冲区,后续会根据需要分配。 -
String::with_capacity(n):返回全新的空字符串,同时在堆上分配至少容纳n字节的缓冲区。 -
slice.to_string():常用于通过字符串字面量创建String。分配一个全新的String,其内容就是slice的副本。 -
iter.collect():通过拼接迭代器的所有项(char、&str或String值)来构建String。如下删除字符串中的空格举例:let spacey = "man hat tan"; let spaceless: String = spacey.chars().filter(|c| !c.is_whitespcae()).collect(); assert_eq!(spaceless, "manhattan"); -
slice.to_owned():将slice的副本作为一个全新分配的String返回。&str类型不能实现Clone,可以通过此方法达到克隆的效果。
15.3.2 - 简单检查 —— 从字符串切片获得基本信息
-
slice.len():返回以字节计算的slice的长度。

本文介绍了Rust语言中字符串和文本的处理方法,包括Unicode、UTF-8编码原理,字符类型及其方法,String和str类型的操作,以及文本搜索、迭代、大小写转换等实用技巧。
最低0.47元/天 解锁文章
702

被折叠的 条评论
为什么被折叠?



