将ISO-8859-1/Latin-1转换为字符串(UTF-8)有哪些选择?

Ode*_*Wat 6 iso-8859-1 character-encoding rust

我扫描了Rust文档,以便在字符编码之间进行转换,但没有找到任何内容.我错过了什么?

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

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

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);
}
Run Code Online (Sandbox Code Playgroud)

得到:

Ä
196
196
[195, 132]
[195, 132]
true
Run Code Online (Sandbox Code Playgroud)

哪个我甚至没有考虑过工作!

bar*_*jak 8

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

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

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

  • 由于我被此绊倒,请注意"只有代码点0 - 127的编码方式相同;代码点128 - 255的区别在于使用UTF-8成为2字节序列,而它们是使用Latin-1的单字节"([来源] ](http://stackoverflow.com/a/7048780/155423)).这意味着你不能简单地将ISO-8859-1中的`u8`片重新解释为UTF-8. (2认同)
  • 是的,“编码为 UTF-8”,但代码点本身是相同的。这就是使他的答案成为将 ISO-8859-1 编码为 UTF-8 的完美解决方案的原因。它就像使用“as char”将每个 ISO-8859-1 字节转换为 char 一样简单。我的特殊情况涉及 ISO-8859-15,这意味着我们必须以不同的方式转换一些字符。 (2认同)

Vla*_*eev 6

标准库没有任何API来处理编码.编码,如日期和时间,很难正确完成,需要大量的工作,所以它们不存在于std.

目前处理编码箱子是锈编码.你几乎肯定会找到你需要的一切.