将wstring转换为小写

8

我想把 wstring 转换成小写。我发现有很多答案使用本地化信息。是否也有像 ToLower() 这样的函数适用于 wstring


2
http://en.cppreference.com/w/cpp/string/wide/towlower - πάντα ῥεῖ
请注意,“小写”是一个与区域相关的操作。在土耳其,towlower('I') != 'i'(实际结果为'ı')。 - Martin Bonner supports Monica
1
事实上,大小写转换是一场噩梦。如链接中所述,希腊字母Σ的小写形式根据单词中的位置可能是σ或ς,而德语中的"SS"在某些情况下可以表示为ß或ss(例如,"MASSE"可以是"Maße"或"masse",具体取决于它是哪个同形异义词!)。请参阅http://unicode.org/faq/casemap_charprop.html以获取更多详细信息。 - Martin Bonner supports Monica
2个回答

13

std::towlower 是你想要的函数,它位于 <cwtype> 中。该头文件包含许多用于处理宽字符串的函数。

示例:

// Convert wstring to upper case
wstring wstrTest = L"I am a STL wstring";
transform(
  wstrTest.begin(), wstrTest.end(),
  wstrTest.begin(),
  towlower);

1
我认为这不能正确地处理跨多个代码单元的代码点。 - eerorika
@user2079303 C++(这里包括C语言)要求任何支持的代码点都适合于wchar_t类型。换句话说,这只是在Windows上的一个问题。(真正的问题是大小写映射不是一对一的代码点,并且与上下文有关,正如其他评论中所指出的那样) - Cubbi
@Cubbi 对于大多数跨平台程序而言,Windows系统问题是个大问题 :) 但是,这确实不是逐个代码单元进行转换无法工作的唯一原因。映射算法必须将字符串作为整体来正确处理。 - eerorika
5
<cwtype>对我不起作用,但是<cwctype>有效。 - Charles Milette

5
希望这能有所帮助。
#include <iostream>
#include <algorithm>

int main ()
{

std::wstring str = L"THIS TEXT!";
std::wcout << "Lowercase of the string '" << str << "' is ";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
std::wcout << "'" << str << "'\n";

return 0;
}

输出:

Lowercase of the string 'THIS TEXT!' is 'this text!'

这种方法非常有效。 - Epirocks
这个算法我不需要BOOST。谢谢! - Rocky Scott
10
这个答案是错误和极其危险的。在字符上使用 ::tolower 已经很危险了,对于宽字符来说更容易导致崩溃。如果传递给 ::tolower 的字符值不能表示为无符号字符且不等于 EOF,则其行为是未定义的。这是因为实现可以使用大小为 [256] 的查找表。如果你传递超过 255 的任何东西(因为宽字符可能会超过),它可能会导致崩溃。 - Kaznov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接