繁体   English   中英

toupper / tolower + locale(德语)

[英]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同时适用于charwchar_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM