代码之家  ›  专栏  ›  技术社区  ›  OderWat

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

  •  8
  • OderWat  · 技术社区  · 9 年前

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

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

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

    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
    

    我甚至没有考虑过这一点!

    2 回复  |  直到 5 年前
        1
  •  14
  •   Timmmm    8 年前

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

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

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

        2
  •  7
  •   Vladimir Matveev    9 年前

    标准库没有任何处理编码的API。像日期和时间这样的编码很难正确完成,需要大量的工作,因此它们不存在于 std .

    这个 目前处理编码的板条箱 rust-encoding 。你几乎肯定会在那里找到你需要的一切。