【问题标题】:to upper with char16_t array用 char16_t 数组向上
【发布时间】:2011-08-28 20:50:55
【问题描述】:

有什么办法可以做得很好。当我尝试使用 Boost 的 to_upper() 时,我得到了一个 std::bad_cast,所以我以这样的方式结束:

while(str[i]!=u'\0')
{
    str[i]=(char16_t)to_upper((wchar_t)str[i]);
    i++;
}

我什至不确定这是否正确,因为我不知道是否可以保证char16_tto_upper 与原始字符的大小相同。而且我不确定这是否会导致下一个字符被覆盖或再次读取最后一个进动的后半部分。抱歉我的愚蠢问题,但我在随机访问和具有可变长度编码的字符类型方面遇到了问题。

【问题讨论】:

  • 我们不知道 char16_t 和 wchar_t 是否具有相同的大小相同的编码,除非您检查您的特定系统。
  • 哦,这是地狱 :) 有干净的方法吗?可能先用大写字母填充 tmp 数组,然后将大写字母从 tmp 复制到 str。
  • 问题当然是我们不知道(可移植地)wchar_t 是什么。这就是我们得到新的 char16_t 和 char32_t 的原因。但是,它们获得了核心语言支持并与 std::string 一起使用,但在库的其余部分中没有得到太多支持。
  • 所以如果我理解正确的话,没有“标准方法”可以对那种数组(char16_t[N])进行大写吗?对我来说幸运的是,我认为我的函数将使用的所有字符都是 UCS-2,它们的大小都是 16 位(我也使用 GCC,所以 wchar_t 应该足够大,尽管我害怕大写字母不会产生预期的结果),但这仍然让我非常非常不舒服。 :)
  • 大写字母取决于语言环境,因此“明显”的方式是来自<locale> 的用户toupper(ch, loc)。但是,这将使用 ctype<char16_t>,这对于语言环境不是强制性的。所以它可能有效,也可能无效。 :-(

标签: c++11 uppercase wchar-t char16-t


【解决方案1】:

最好的方法可能是这样的:

char16_t upper = std::use_facet<std::ctype<char16_t>>(std::locale()).toupper(ch);

【讨论】:

  • 哦,天哪,你能解释一下那条线是什么意思吗?我不想无聊,但不理解 c/p 代码我会感到不舒服。
  • ctype 是对特定类型字符进行分类的构面(区域设置元素)。 use_facet 使用来自指定语言环境的指定方面类型。唯一的问题是当前的 C++0x 草案不需要 ctype&lt;char16_t&gt;ctype&lt;char32_t&gt; 专业化,因此它可能并不总是有效。这仍然是我能想到的最好的方法。
  • 错误 - Implicit instantiation of undefined template 'std::__1::ctype&lt;char16_t&gt;'
猜你喜欢
  • 2017-04-27
  • 2017-12-16
  • 2011-08-14
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2014-11-08
  • 2011-12-31
  • 2013-01-09
相关资源
最近更新 更多