Rust从入门到实战系列七十六:使用字符串存储 UTF-8 编码的文本

本文详细介绍了Rust编程语言中的字符串处理,包括String类型、strslices,以及它们与UTF-8编码的关系。重点讲解了如何创建、更新和处理字符串,以及不同字符串类型的选择和适用场景。
摘要由CSDN通过智能技术生成
commit db403a8bdfe5223d952737f54b0d9651b3e6ae1d

第四章已经讲过一些字符串的内容,不过现在让我们更深入地了解它。字符串是新晋 Rustacean 们通常会被困住的领域,这是由于三方面理由的结合:Rust 倾向于确保暴露出可能的错误,字符串是比很多程序员所想象的要更为复杂的数据结构,以及 UTF-8。所有这些要素结合起来对于来自其他语言背景的程序员就可能显得很困难了。
在集合章节中讨论字符串的原因是,字符串就是作为字节的集合外加一些方法实现的,当这些字节被解释为文本时,这些方法提供了实用的功能。在这一部分,我们会讲到 String 中那些任何集合类型都有的操作,比如创建、更新和读取。也会讨论 String 与其他集合不一样的地方,例如索引 String 是很复杂的,由于人和计算机理解 String 数据方式的不同。
什么是字符串?
在开始深入这些方面之前,我们需要讨论一下术语 字符串的具体意义。Rust 的核心语言中只有一种字符串类型:str,字符串 slice,它通常以被借用的形式出现,&str。第四章讲到了 字符串 slice:它们是一些储存在别处的 UTF-8 编码字符串数据的引用。比如字符串字面值被储存在程序的二进制输出中,字符
串 slice 也是如此。
称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rustacean 们谈到 Rust 的 ” 字符串” 时,它们通常指的是 String 和字符串slice &str 类型,而不仅仅是其中之一。虽然本部分内容大多是关于 String 的,不过这两个类型在 Rust标准库中都被广泛使用,String 和字符串 slice 都是 UTF-8 编码的。
Rust 标准库中还包含一系列其他字符串类型,比如 OsString、OsStr、CString 和 CStr。相关库 crate甚至会提供更多储存字符串数据的选择。看到这些由 String 或是 Str 结尾的名字了吗?这对应着它们提供的所有权和可借用的字符串变体,就像是你之前看到的 String 和 str。举例而言,这些字符串类型能够以不同的编码,或者内存表现形式上以不同的形式,来存储文本内容。本章将不会讨论其他这些字符串类型,更多有关如何使用它们以及各自适合的场景,请参见其 API 文档。
新建字符串
很多 Vec 可用的操作在 String 中同样可用,从以 new 函数创建字符串开始。

let mut s = String::new();
# }

这新建了一个叫做 s 的空的字符串,接着我们可以向其中装载数据。通常字符串会有初始数据,因为我们希望一开始就有这个字符串。为此,可以使用 to_string 方法,它能用于任何实现了 Display trait 的类型,字符串字面值也实现了它。

let data = "initial contents";
let s = data.to_string();
// 该方法也可直接用于字符串字面值:
let s = "initial contents".to_string();
# }

这些代码会创建包含 initial contents 的字符串。
也可以使用 String:: from 函数来从字符串字面值创建 String。

let s = String::from("initial contents");
# }

因为字符串应用广泛,这里有很多不同的用于字符串的通用 API 可供选择。其中一些可能看起来多余,不过都有其用武之地!在这个例子中,String:: from 和 .to_string 最终做了完全相同的工作,所以如何选择就是代码风格与可读性的问题了。
记住字符串是 UTF-8 编码的,所以可以包含任何可以正确编码的数据。

let hello = String::from(" مالسلا مكيلع");
let hello = String::from("Dobrý den");
let hello = String::from("Hello");
let hello = String::from(" שָׁולֹם");
let hello = String::from(" नमस◌्त◌े");
let hello = String::from(" こんにちは");
let hello = String::from(" 안녕하세요");
let hello = String::from(" 你好");
let hello = String::from("Olá");
let hello = String::from("Здравствуйте");
let hello = String::from("Hola");
# }

所有这些都是有效的 String 值。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值