【问题标题】:Converting wstring to lower case将 wstring 转换为小写
【发布时间】:2017-02-03 10:33:20
【问题描述】:

我想将wstring 转换为小写。我发现使用语言环境信息有很多答案。 wstring 也有类似ToLower() 的功能吗?

【问题讨论】:

  • 请注意,“小写”本质上是特定于语言环境的操作。在土耳其,towlower('I'L) != 'i'L(结果其实是'ı'
  • 事实上,大小写转换是一场噩梦。如链接中所述,小写“Σ”是“σ”和“ς”,具体取决于单词中的位置,德语中的小写“SS”是“ß”或“ss”——取决于单词(“ MASSE”可以是“Maße”或“masse”,具体取决于它是哪个同形异义词!)。有关更多血腥细节,请参阅unicode.org/faq/casemap_charprop.html

标签: c++ string utf-16


【解决方案1】:

std::towlower 是你想要的函数,来自<cwtype>。此标头包含许多处理宽字符串的函数。

例子:

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

【讨论】:

  • 我认为这不适用于跨多个代码单元的代码点。
  • @user2079303 C++(和此处的 C)要求任何支持的代码点都适合 wchar_t。换句话说,这只是 Windows 上的问题。 (真正的问题是 case 映射在代码点中不是 1:1 并且是上下文相关的,正如其他 cmets 中所指出的)
  • @Cubbi Windows 问题是大多数跨平台程序的问题 :) 但是,这确实不是一次转换一个代码单元无法工作的唯一原因。映射算法必须将字符串作为一个整体处理才能正常工作。
  • <cwtype> 对我不起作用,但 <cwctype> 起作用。
【解决方案2】:

希望对您有所帮助..

#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!'

【讨论】:

  • 用这种方法效果很好 ta
  • 这与 我不需要 BOOST。谢谢!
  • 这个答案是错误的,非常危险。在字符 (!) 上使用 ::tolower 已经很危险了,在 wchars 上它只是要求崩溃。如果传递给 ::tolower 的字符值不能表示为 unsigned char 且不等于 EOF,则行为未定义。这是因为实现可以使用大小为 [256] 的查找表。如果你传递任何大于 255(如 wchars 一样)的东西,它可能会简单地崩溃。
猜你喜欢
  • 2013-02-02
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2011-01-03
  • 2018-01-14
  • 2012-12-12
  • 2012-07-01
相关资源
最近更新 更多