【Rust 笔记】15-字符串与文本(上)

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

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 的 Stringstr 类型使用 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 类型实现了 CopyClone,以及比较、散列、格式的所有常用特型。

15.2.1 - 字符分类 —— 检测字符类别的方法

  • ch.is_numeric():数值字符,包括 Unicode 普通类别 Number; digitNumber; 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),其中 numu32。否则,返回 Noneradix 的范围是 2~36。如果 radix > 10,那么 ASCII 字母将作为值为 10~35 的数字。
  • std::char::from_digit(num, radix):把 u32 数值 num 转换为 char。如果 radix > 10ch 是小写字母。
  • 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 值转换为 charchar 类型也实现了 From<u8>。推荐使用 std::char::from_u32,返回 Option<char>

15.3-String 与 str

  • Rust 的 Stringstr 类型只保存格式良好的 UTF-8。

  • String 类型能创建可伸缩缓冲区,用于保存字符串。本质为 Vec<u8> 的包装类型。

  • str 类型则就地操作字符串文本。

  • String 的解引用为 &strstr 上定义的所有方法,都可以在 String 上直接调用。

  • 文本处理的方法按照字节偏移量来索引文本,也按字节来度量长度,并不是按照字符。

  • Rust 会根据变量的名称,推测其类型,如:

    变量名 推测类型
    string String
    slice &str 或解引用为 &str 的类型,如 StringRc<String>
    ch char
    n usize,长度
    i, j usize,字节偏移量
    range usize 字节偏移量范围,可能是全限定 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&strString 值)来构建 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 的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phial03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值