【问题标题】:How to get a char's unicode value?如何获取char的unicode值?
【发布时间】:2021-02-18 10:12:08
【问题描述】:

我想获取汉字的 Unicode 值。它可能看起来像let values: &[u16] = f("ののの");

当我使用"の".as_bytes() 时,我得到了[227, 129, 174]

当我使用'の'.escape_unicode() 时,我得到了'\u306e'0x306e 正是我想要的。

【问题讨论】:

  • 'の' as u16,十六进制编码。如果您想对整个字符串进行操作,并且您确信它都是汉字,您可以将其编码为 UTF-16。
  • ...当然,如果您正在寻找代码点,那么强烈推荐使用as u32。确实,utf-16 对于今天的汉字来说已经足够好了,但总的来说,编码只是一团糟。许多字符将无法使用u16 提供正确的代码点。
  • "の????".chars().map(|ch| ch as u32).collect::<Vec<_>>(),尽管在大多数情况下直接使用.chars() 就足够了。请注意 ????需要超过 16 位。

标签: rust


【解决方案1】:

char 类型可以使用 as 转换为 u32。线

println!("{:x}", 'の' as u32);

将打印“306e”(使用{:x} 将数字格式化为十六进制)。

如果您确定所有角色都在BMP 中,理论上您也可以直接转换为u16。但是,对于来自补充平面的字符,这会默默地给出错误的结果,例如'?' as u16 返回 0xf756 而不是正确的 0x1f756,因此您需要有充分的理由这样做。

在内部,char 存储为 32 位数字,因此对于某些字符 cc as u32 仅将字符的内存表示重新解释为 u32

【讨论】:

  • 我会说“永远不要使用u16!”这只是误导和不必要的“优化”。但值得称赞的是,as u16 默默地丢弃了代码点的高阶 16 位。这是很好的信息,并且很好地研究了。我建议将其更多地表述为“不要这样做”,因为您可能知道您的角色今天都在 BMP 中,但明天可能不会。
  • 谢谢。顺便问一下,你知道如何得到它的 Shift JIS 值吗?我应该使用查找表吗?
  • @RayToal 我同意并稍微改变了措辞。
  • @AurevoirXavier 我刚刚在 Google 上为您搜索了该内容 - 给您:stackoverflow.com/questions/48136939/…
  • @SvenMarnach 你拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2018-06-02
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多