如何将字符串(wstring)从小写字符转换为大写字符,反之亦然? 我在网上搜索,发现有一个STL函数std :: transform 但到目前为止,我还没想出如何将正确的语言环境对象(例如“Germany_german”)赋予该函数。 谁能帮帮忙? 我的代码看起来像:
wstring strin = L"ABCÄÖÜabcäöü";
wstring str = strin;
locale loc( "Germany_german" ); // ??? how to apply this ???
std::transform( str.begin(), str.end(), str.begin(), (int(*)(int)tolower );
//result: "abcäöüabcäöü"
字符ÄÖÜ和äöü(就像Ae,Oe,Ue)将无法正确转换。
P.S。:我不喜欢大开关汗水而且我知道BOOST能够胜任一切,我更喜欢STL解决方案。
提前谢谢你 糟糕答案 0 :(得分:9)
您需要以不同的方式应用它:
for(unsigned i=0;i<str.size();i++)
str[i]=std::toupper(str[i],loc);
或设置全局区域设置
std::locale::global(std::locale("Germany_german"));
然后
std::transform( str.begin(), str.end(), str.begin(), std::toupper );
请参阅:http://www.cplusplus.com/reference/std/locale/tolower/
注1 C toupper与std :: toupper不同,它接收std :: locale作为参数,它仅使用char
作为参数,std::toupper
同时适用于char
1}}和wchar_t
。
注意2 std::locale
对于德语来说非常破碎,因为它在字符基础上工作,无法将“ß”转换为“SS”,但它适用于大多数其他字符。 ..
注3:如果您需要正确大小写转换,包括处理“ß”等字符,则需要使用ICU或Boost.Locale等优秀的本地化库
答案 1 :(得分:3)
问题是tolower()
/ toupper()
从根本上打破了很多区域设置。您如何建议toupper()
应该使用包含'ß'
的字词?什么是"Maße"
的全部大写?[1]在法语和其他语言中也有类似的例子。
首先要问自己,为什么你需要这个以及你想要实现的目标。
如果您愿意忽略所有这些问题, here 是谷歌找到我的第一个主题。 (如果你想要谷歌更多这方面的话,詹姆斯坎泽多年来在很多C ++新闻组中都发布了许多关于这个问题的有用见解。)
[1]暗示少数非德国人在这里闲逛:)
:在德语中,“ß”,字面意思是“sz”的结合,不能作为大写字母。它可以被“ss”取代,但并非总是如此。例如,“Masse”与“Maße”完全不同。
答案 2 :(得分:1)
您是否尝试"de_DE.UTF-8"
进行区域设置构建?
答案 3 :(得分:1)
如果您使用的是Unix,请参阅/usr/share/locale/
了解可用的语言环境。看起来你想要"de_DE.UTF-8"
。
但是setlocale(LC_ALL, "");
应该将程序设置为在系统的语言环境中工作,无论它是什么。
如果我只是设置这样的默认语言环境而不指定德语,那么你的程序对我有用(我修了一个关闭)。