为什么我不能把`u32`转换为'char`?

时间:2014-09-29 20:00:57

标签: rust

我正在努力学习Rust,我开始考虑char的宽度是4字节。我可以将char转换为u32并且它可以解决(它们都是4个字节宽),但是,当我从u32转换为char时,Rust抱怨:

fn main() {
    let pizza_hex: u32 = 0x1f355;
    let pizza: char = ''; // (pizza char: http://www.fileformat.info/info/unicode/char/1f355/index.htm)

    // pizza as hex = 1f355
    println!("pizza as hex = {:x}", pizza as u32);

    // size of pizza = 4
    println!("size of pizza = {}", std::mem::size_of_val(&pizza));

    // This doesn't work super well
    println!("{} == {}", pizza_hex as char, pizza);
}
error[E0604]: only `u8` can be cast as `char`, not `u32`
  --> src/main.rs:12:26
   |
12 |     println!("{} == {}", pizza_hex as char, pizza);
   |                          ^^^^^^^^^^^^^^^^^

任何想法为什么?

1 个答案:

答案 0 :(得分:18)

每个char都是有效的u32值,但每个u32值都是有效的char

char的属性包含有效的Unicode代码点factors into memory safety

  

行为被视为未定义

     
      
  • 基本类型中的值无效,即使在私有字段和本地区域中也是如此:      
        
    • char中代替char::MAX或更高u32的值。
    •   
  •   

要在运行时将char转换为if let Some(pizza_from_hex) = std::char::from_u32(pizza_hex) { println!("{} == {}", pizza_from_hex, pizza); } ,请尝试以下操作:

let pizza_from_hex = '\u{01f355}';

println!("{} == {}", pizza_from_hex, pizza);

如果您不想在字符文字中使用令人毛骨悚然的Unicode字形,则可以使用Unicode转义序列:

{{1}}