【发布时间】: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_t 的to_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