首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能将`u32`转换为`char`?

为什么不能将`u32`转换为`char`?
EN

Stack Overflow用户
提问于 2014-09-30 04:00:57
回答 1查看 9.7K关注 0票数 16

我正在尝试学习Rust,然后我开始思考chars是如何4字节宽的。我可以将char转换为u32,它可以工作(它们都是4字节宽),然而,当我从u32转换为char时,Rust抱怨道:

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
error[E0604]: only `u8` can be cast as `char`, not `u32`
  --> src/main.rs:12:26
   |
12 |     println!("{} == {}", pizza_hex as char, pizza);
   |                          ^^^^^^^^^^^^^^^^^

你知道为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-30 04:05:27

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

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

未定义的

行为

  • 基元类型中的无效值,即使在私有字段和局部变量中也是如此:
    • 是代理或高于代理值的char中的值

要在运行时将u32转换为char,请尝试执行以下操作:

代码语言:javascript
复制
if let Some(pizza_from_hex) = std::char::from_u32(pizza_hex) {
    println!("{} == {}", pizza_from_hex, pizza);
}

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

代码语言:javascript
复制
let pizza_from_hex = '\u{01f355}';

println!("{} == {}", pizza_from_hex, pizza);
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26107876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档