如何在Rust中将UTF-8十六进制值转换为char?

jgwigjjp  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(265)

我有一个Unicode字符的十六进制值。如何在Rust中将其转换为char
char::from_u32()不工作,因为char似乎不包含十六进制值:

fn main() {
    let code_point: u32 = 0xf09f8cb8; //emoji '🌸'
    println!("{}", code_point); //=> 4036988088

    let c = '🌸';
    println!("{}", c as u32); //=> 127800 (not 4036988088)
}
jdg4fx2g

jdg4fx2g1#

正如其他人所指出的,u32值不是一个代码点,而是一个UTF-8字节序列(当被视为big-endian时)。
您可以通过组合u32::to_be_bytes()std::str::from_utf8()将此值转换为字符串:

fn main() {
    let utf8_u32: u32 = 0xf09f8cb8;
    let utf8_bytes = utf8_u32.to_be_bytes();
    let s = std::str::from_utf8(&utf8_bytes);
    
    assert_eq!(s, Ok("🌸"));
}
tgabmvqs

tgabmvqs2#

您的代码将十六进制值视为Unicode码位,但它们实际上是emoji的UTF-8编码。要对其进行解码,请将字节存储为字节字符串并调用std::str::from_utf8

let bytes: &[u8] = b"\xf0\x9f\x8c\xb8";
let string: &str = std::str::from_utf8(bytes)?;
println!("{}", string);

输出:

🌸

Playground

相关问题