[英]toupper/tolower + locale (german)
如何将字符串(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)将无法正确转换。
PS:我不喜欢大开关汗 ,而且我也知道BOOST能胜任一切,我更喜欢STL解决方案。
提前致谢
哎呀
您需要以不同的方式应用它:
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
和wchar_t
。
注意2 std::locale
对于德语非常破碎,因为它在字符基础上工作,不能将“ß”转换为“SS”,但它适用于大多数其他字符......
注3:如果你需要正确的大小写转换,包括处理像“ß”这样的字符,你需要使用像ICU或Boost.Locale这样的好的本地化库。
问题是tolower()
/ toupper()
从根本上打破了许多语言环境。 你如何建议toupper()
应该使用包含'ß'
单词? 什么是"Maße"
的全部案例?[1]在法语和其他语言中也有类似的例子。
所以首先要问自己,为什么你需要这个以及你想要实现的目标。
如果你愿意忽略所有这些问题, 这是谷歌找到我的第一个主题。 (如果你想要谷歌更多的话,詹姆斯坎泽多年来在很多C ++新闻组中发布了很多关于这个问题的有用见解。)
[1]暗示少数非德国人在这里闲逛:)
:在德语中,“ß”,字面意思是“sz”的结扎,不能作为大写字母。 它可以被“ss”取代,但并非总是如此。 例如,“Masse”与“Maße”完全不同。
您是否尝试使用"de_DE.UTF-8"
进行区域设置构建?
如果你在Unix上,请参阅/usr/share/locale/
获取可用的语言环境。 看起来你想要"de_DE.UTF-8"
。
但是setlocale(LC_ALL, "");
应该将程序设置为在系统的语言环境中工作,无论它是什么。
如果我只是设置这样的默认语言环境,而不指定德语,那么你的程序适合我(我修了一个关闭)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.