Rust类型之字符串

字符串

Rust 中的字符串类型是String。虽然字符串只是比字符多了一个“串”字,但是在Rust中这两者的存储方式完全不一样,字符串不是字符的数组,String内部存储的是Unicode字符串的UTF8编码,而char直接存的是Unicode Scalar Value
Rust字符串对Unicode字符集有着良好的支持,可以看一下示例:

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("Olá");
let hello = String::from("السلام عليكم");
let hello = String::from("Здравствуйте");
let hello = String::from("Hola");

Rust 中的String不能通过下标去访问。

let testString = String::from("天下");
let s = testString[0]; // 你可能想把“天”字取出来,但实际上这样是错误的

String存储的Unicode序列的UTF8编码,而UTF8编码是变长编码。上边即使能访问成功,也只能取出一个字符的 UTF8 编码的第一个字节,很可能是没有意义的。因此 Rust 直接对String禁止了这个索引操作。

字符串字面量中的转义

与 C 语言一样,Rust 中转义符号也是反斜杠\,可用来转义各种字符。

fn main() {
   
    // 将""号进行转义
    let byte_escape = "I'm saying \"Hello\"";
    println!("{}", byte_escape); 
    //输出的内容为 I'm saying "Hello"
    
    // 分两行打印
    let byte_escape = "I'm saying \n 你好";
    println!("{}", byte_escape);
    //输出的内容是
    // I'm saying
    // 你好
    
    // Windows下的换行符
    let byte_escape = "I'm saying \r\n 你好";
    println!("{}", byte_escape);
    //输出的内容是
    // I'm saying
    // 你好
    
    
    // 打印出 \ 本身
    let byte_escape = "I'm saying \\ Ok";
    println!("{}", byte_escape);
    //输出的内容是  I'm saying \ Ok
    
    // 强行在字符串后面加个0,与C语言的字符串一致。
    let byte_escape = "I'm saying hello.\0";
    println!("{}", byte_escape);
     //输出的内容是 I'm saying hello.
}

在这里插入图片描述

Rust 还支持通过\x输入等值的 ASCII 字符,以及通过\u{}输入等值的 Unicode 字符。

fn main() {
   
    // 使用 \x 输入等值的ASCII字符(最高7位)
    let byte_escape = "I'm saying hello \x7f";
    println!("{}", byte_escape);
    
    // 使用 \u{} 输入等值的Unicode字符(最高24位)
    let byte_escape = "I'm saying hello \u{0065}"; // 0065表示的是十六进制 65,也是十进制 101
    println!("{}", byte_escape);
}

在这里插入图片描述

禁止转义的字符串字面量

我们要是想输出原始字面量,也就是不进行转义,使用 r""r#""#把字符串字面量套起来就行了。

fn main() {
   
    // 字符串字面量前面加r,表示不转义
    let test_str = r"test \x7f \u{0066}";
    println!("{}", test_str);
    
    // 这个字面量必须使用r##这种形式,因为我们希望在字符串字面量里面保留""
    let test_string = r#"He says: "Work hard and make progresses everyday""#;
    println!("{}", test_string );
    
    // 如果遇到字面量里面有#号的情况,可以在r后面,加任意多的前后配对的#号,
    // 只要能帮助Rust编译器识别就行
    let test_string1 = r###"A string has "# in it. And even "##!"###;
    println!("{}", test_string1);
}

在这里插入图片描述

字节串

很多时候,我们只需要 ASCII 字符集,字符串字面量中用不到Unicode字符。对于这种问题,Rust 还有一种更紧凑的表示法:字节串。用b开头,双引号括起来,比如b"this is a byte string"。这时候字符串的类型已不是字符串,而是字节的数组 [u8; N]N为字节数。示例代码如下:

fn main() {
   
    // 字节串的类型是字节的数组,而不是字符串了
    let bytestring: &[u8; 21] = b"this is a byte string";
    println!("A byte string: {:?}", bytestring);
    
    // 可以看看下面这串打印出什么
    let escaped = b"\x52\x75\x73\x74 as bytes";
    println!("Some escaped bytes: {:?}", escaped);

    // 字节串与原始字面量结合使用
    let raw_bytestring = br"\u{211D} is not escaped here";
    println!("{:?}", raw_bytestring);
}

在这里插入图片描述

相关推荐

  1. Rust---复合数据类型字符串(1)

    2024-01-11 21:14:02       40 阅读
  2. Rust基础类型布尔类型字符

    2024-01-11 21:14:02       52 阅读
  3. Rust基本数据类型-字符串

    2024-01-11 21:14:02       38 阅读
  4. Rust字符串String类型学习

    2024-01-11 21:14:02       29 阅读
  5. Rust语言字符串

    2024-01-11 21:14:02       48 阅读
  6. Python字符串数据类型字符串

    2024-01-11 21:14:02       20 阅读
  7. Rust 中的字符串类型:`&str` 和 `String`

    2024-01-11 21:14:02       37 阅读
  8. Rust复合类型元组

    2024-01-11 21:14:02       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-11 21:14:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-11 21:14:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-11 21:14:02       82 阅读
  4. Python语言-面向对象

    2024-01-11 21:14:02       91 阅读

热门阅读

  1. 【MySQL】巧用 DATE_SUB 函数判断时间是否连续

    2024-01-11 21:14:02       66 阅读
  2. Redis群集-主从、哨兵、集群

    2024-01-11 21:14:02       46 阅读
  3. 《程序设计基础》学习笔记

    2024-01-11 21:14:02       51 阅读
  4. 三、计算机理论-关系数据库-结构化查询语言SQL

    2024-01-11 21:14:02       63 阅读
  5. 【无标题】

    2024-01-11 21:14:02       42 阅读
  6. 我国实施个人信息出境认证的要点

    2024-01-11 21:14:02       54 阅读
  7. SpringMVC-03

    2024-01-11 21:14:02       55 阅读