我扫描了Rust文档,寻找在字符编码之间转换的方法,但没有找到任何东西.我错过什么了吗?

Rust语言及其标准库是否(直接或间接)支持它,甚至计划在不久的将来支持它?

其中一个答案表明,有一个简单的解决方案,因为u8可以转换为(Unicode)chars.由于Unicode是ISO-8859-1中代码点的超集,这是一个1:1映射,在UTF-8中编码为多个字节,UTF-8是Rust中Strings的内部编码.

fn main() {
    println!("{}", 196u8 as char);
    println!("{}", (196u8 as char) as u8);
    println!("{}", 'Ä' as u8);
    println!("{:?}", 'Ä'.to_string().as_bytes());
    println!("{:?}", "Ä".as_bytes());
    println!("{}",'Ä' == 196u8 as char);
}

给予:

Ä
196
196
[195, 132]
[195, 132]
true

我甚至都没想过要工作!

推荐答案

Rust中的字符串是unicode(UTF-8),unicode代码点是iso-8859-1字符的超集.这种特定的转换实际上是微不足道的.

fn latin1_to_string(s: &[u8]) -> String {
    s.iter().map(|&c| c as char).collect()
}

我们将每个字节解释为一个unicode码点,然后从这些码点构建一个字符串.

Rust相关问答推荐

if let声明中临时对象的生存期

为什么迭代器上的`. map(...)`的返回类型如此复杂?

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

rust 蚀生命周期 行为

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

在Rust中显式装箱受生存期限制的转换闭包

闭包不会发送,即使它只捕获发送变量

如何模拟/创建ReqData以测试Actix Web请求处理程序?

什么时候和为什么S最好是按值或引用传递简单类型

无法实现整型类型的泛型FN

程序在频道RX上挂起

在铁 rust 中,如何一次只引用几件事中的一件?

RUST 中的读写器锁定模式

如何将一个矩阵的列分配给另一个矩阵,纳尔代数?

LinkedList::drain_filter::drop 中 DropGuard 的作用是什么?

SDL2 没有在终端键上触发?

第 7.4 章片段中如何定义 `thread_rng`

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

以下打印数组每个元素的 Rust 代码有什么问题?

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求