【RUST学习日记】第16课 字符串的常用方法(二)

简介: 【RUST学习日记】第16课 字符串的常用方法(二)

0x00 回顾与开篇


上一篇文章介绍了Rust的字符串常见的修改方法这节课开始介绍Rust字符串的访问方法。介绍Rust字符串的文章,这已经是第4篇了。后续如果还有时间,我会更加详细的在介绍下字符串的一些其它知识。


0x01 Unicode和UTF-8


在计算机中最常见的编码应该就是ASCII编码了,但是ASCII编码的范围只有0x000x7F,无法存储汉字,少数民族文字等等。从而出现了GB2312,GB18030等各种编码。为了统一字符编码,国际标准化组织制定了通用的多字节编码字符集,也就是**Unicode**字符集。其包含了所有世界上所有的语言和各种字符。其中最常用的范围是0x00000xD7FF和0xE000~0x10FFFF。


但是Unicode字符集每个字符都占4个字节,为了节省空间,UTF-8是最简单且高效的一种编码格式。在Rust中String和&str类型都是使用UTF-8编码格式表示文本。UTF-8是以1字节为编码单位的可变长编码,它根据一定规则将码位编码为1~4字节。如下表所示:


image.png


这就很好理解上节所说的汉字占3个字节,而英文字母,阿拉伯数字占1个字节的原因了。

UTF-8编码举例如下:


image.png


示例代码如下:


 

println!("***************1、编码*****************");
    let a = "a";
    let b = "©";
    let c = "汉";
    let d = "😃";
    println!("a 占 {} 个字节", std::mem::size_of_val(a));
    println!("b 占 {} 个字节", std::mem::size_of_val(b));
    println!("c 占 {} 个字节", std::mem::size_of_val(c));
    println!("d 占 {} 个字节", std::mem::size_of_val(d));
    println!("\n***************1、编码(打印二进制)*****************");
    for x in a.bytes() {
        print!("{:08b}_", x);
    }
    println!();
    for x in b.bytes() {
        print!("{:08b}_", x);
    }
    println!();
    for x in c.bytes() {
        print!("{:08b}_", x);
    }
    println!();
    for x in d.bytes() {
        print!("{:08b}_", x);
    }
    println!("\n***************1、编码(打印Unicode)*****************");
    println!("{:X}", 'a' as i32);
    println!("{:X}", '©' as i32);
    println!("{:X}", '汉' as i32);
    println!("{:X}", '😃' as i32);


代码运行结果:


***************1、编码*****************
a 占 1 个字节
b 占 2 个字节
c 占 3 个字节
d 占 4 个字节
***************1、编码(打印二进制)*****************
01100001_
11000010_10101001_
11100110_10110001_10001001_
11110000_10011111_10011000_10000011_
***************1、编码(打印Unicode)*****************
61
A9
6C49
1F603

编码和解码规则这里就不赘述了,感兴趣的可以搜索下资料。如果留言比较多,我额外一章讲解下编码解码。


0x02 字符串的访问


在Rust中,字符串的访问要注意以下两个点:

1、由于字符串是UTF-8编码的字节序列,是可变长度编码,所以不能直接使用索引来访问字符。

2、字符串操作分为按字节处理按字符处理两种方式。使用bytes()方法是按字节处理,返回字节迭代的迭代器。使用chars()方法是按字符处理,返回字符迭代的迭代器。


字符串的长度


如果通过len()方法获取字符串的长度,则返回的是以字节为单位的长度,即字符串中所有字符的总字节数。如果通过chars().count()方法获取的长度则表示字符的长度,通过此方法获取的长度就是咱们嘴上常说的字符串长度啦。

示例代码如下:

let string_length = "我正在学习Rust~";
println!("\"{}\"的字节长度 : {}", string_length, string_length.len());
println!("\"{}\"的字符长度 : {}", string_length, string_length.chars().count());
代码运行结果:
"我正在学习Rust~"的字节长度 : 20
"我正在学习Rust~"的字符长度 : 10


访问字符串元素


由于Rust的字符串是UTF-8编码,所以不允许直接使用索引来访问单个字符元素。那么咱们只能借助迭代器来访问。(有关迭代器的相关知识将在后续章节介绍)bytes()char()方法分别返回字节和字符迭代器,他们中存在nth方法可以通过索引的形式去访问元素。该方法返回的是Option类型。

示例代码如下:

let string_nth = "Rust编程基础";
// 访问第5个字符
dbg!(string_nth.chars().nth(5));
// 访问第5个字节
dbg!(string_nth.bytes().nth(5));
代码运行结果:
[src\main.rs:45] string_nth.chars().nth(5) = Some(
    '程',
)
[src\main.rs:47] string_nth.bytes().nth(5) = Some(
    188,
)


0x03 小结


花了4篇文章也只是简单介绍了Rust的字符串,要想真正的了解字符串的方法,还需要多练习。其实关于Rust字符串的知识和相关方法还是挺多的,由于篇幅有限,字符串的讲解就暂告一段落了。


0x04 参考资料


Unicode所有区段 统一码编码范围 | Unicode符号库 ✏️ https://fuhaoku.net/blocks

相关文章
|
4天前
|
Rust 算法 安全
学习Rust
【10月更文挑战第13天】学习Rust
28 8
|
5天前
|
Rust 安全 算法
Rust的学习
【10月更文挑战第12天】Rust的学习
13 2
|
5天前
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
17 1
|
17天前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
10 0
|
1月前
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
72 2
|
1月前
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
21 1
|
Rust 安全 Java
Rust学习笔记
Rust学习笔记
224 0
Rust学习笔记
|
2月前
|
Rust 安全 Go
揭秘Rust语言:为何它能让你在编程江湖中,既安全驰骋又高效超车,颠覆你的编程世界观!
【8月更文挑战第31天】Rust 是一门新兴的系统级编程语言,以其卓越的安全性、高性能和强大的并发能力著称。它通过独特的所有权和借用检查机制解决了内存安全问题,使开发者既能享受 C/C++ 的性能,又能避免常见的内存错误。Rust 支持零成本抽象,确保高级抽象不牺牲性能,同时提供模块化和并发编程支持,适用于系统应用、嵌入式设备及网络服务等多种场景。从简单的 “Hello World” 程序到复杂的系统开发,Rust 正逐渐成为现代软件开发的热门选择。
56 1
|
9天前
|
Rust 安全 网络安全
在 Rust 语言中,寻找企业上网行为管理软件的突破
在数字化企业环境中,上网行为管理软件对于保障网络安全和提升工作效率至关重要。Rust 语言凭借其安全性、高性能和并发性,为开发此类软件提供了新机遇。本文通过几个 Rust 代码示例,展示了如何实现网址检查、访问频率统计及访问控制等功能,旨在探索 Rust 在企业上网行为管理中的应用潜力。
19 0
|
2月前
|
Rust 安全 编译器
初探 Rust 语言与环境搭建
Rust 是一门始于2006年的系统编程语言,由Mozilla研究员Graydon Hoare发起,旨在确保内存安全而不牺牲性能。通过所有权、借用和生命周期机制,Rust避免了空指针和数据竞争等问题,简化了并发编程。相较于C/C++,Rust在编译时预防内存错误,提供类似C++的语法和更高的安全性。Rust适用于系统编程、WebAssembly、嵌入式系统和工具开发等领域。其生态系统包括Cargo包管理器和活跃社区。学习资源如"The Book"和"Rust by Example"帮助新手入门。安装Rust可通过Rustup进行,支持跨平台操作。
138 2
初探 Rust 语言与环境搭建