toupper / tolower + locale(德语)

时间:2010-04-08 08:47:36

标签: c++

如何将字符串(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解决方案。

提前谢谢你 糟糕

4 个答案:

答案 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, "");应该将程序设置为在系统的语言环境中工作,无论它是什么。

如果我只是设置这样的默认语言环境而不指定德语,那么你的程序对我有用(我修了一个关闭)。