我正在尝试学习Rust,然后我开始思考chars是如何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);
| ^^^^^^^^^^^^^^^^^你知道为什么吗?
发布于 2014-09-30 04:05:27
每个char都是有效的u32值,但并非每个u32值都是有效的char。
包含有效Unicode代码点( factors into memory safety )的char的属性。
未定义的
行为
char中的值
要在运行时将u32转换为char,请尝试执行以下操作:
if let Some(pizza_from_hex) = std::char::from_u32(pizza_hex) {
println!("{} == {}", pizza_from_hex, pizza);
}如果你不想在字符文字中出现令人毛骨悚然的Unicode字形,你可以使用Unicode转义序列:
let pizza_from_hex = '\u{01f355}';
println!("{} == {}", pizza_from_hex, pizza);https://stackoverflow.com/questions/26107876
复制相似问题