将char转换为大写

时间:2016-02-16 12:07:16

标签: rust

我有一个包含单个char的变量。我想将此char转换为大写。但是,to_uppercase函数会返回rustc_unicode::char::ToUppercase结构而不是char

2 个答案:

答案 0 :(得分:17)

解释

ToUppercaseIterator,可能会产生多个char。这是必要的,因为一些Unicode字符由多个“Unicode标量值”(Rust char表示)组成。

一个很好的例子是所谓的ligatures。试试这个例子(on playground):

let fi_upper: Vec<_> = 'fi'.to_uppercase().collect();
println!("{:?}", fi_upper);   // prints: ['F', 'I']

'fi'连字是一个单一字符,其大写版本由两个字母/字符组成。

解决方案

如何处理这个问题有多种可能性:

  1. 处理&str :如果您的数据实际上是字符串形式,请使用str::to_uppercase返回String,这样更容易使用。
  2. 使用ASCII方法:如果您确定您的数据仅为ASCII和/或您不关心unicode符号,则可以使用仅返回{{1}的std::ascii::AsciiExt::to_ascii_uppercase }}。但它只会将字母char更改为'a'并忽略所有其他字符!
  3. 手动处理:收集到上面示例中的'z'String

答案 1 :(得分:9)

ToUppercase是一个迭代器,因为某些Unicode字符的大写版本可能更多,因为该字符的大写版本可能由多个代码点组成,如delnan所指出的那样评论。您可以将其转换为字符向量:

c.to_uppercase().collect::<Vec<_>>();

然后,你应该将这些字符收集到一个字符串中,就像ker指出的那样。