C++对特殊字符如ü

TVA*_*ren 5 c++ character-encoding htmlspecialchars

我无法使用C++中的tolower()函数将字符串转换为小写.使用普通字符串时,它会按预期工作,但不会成功转换特殊字符.

我如何使用我的功能:

string NotLowerCase = "Grüßen";
string LowerCase = "";
for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
    LowerCase += tolower(NotLowerCase[i]);
    }
Run Code Online (Sandbox Code Playgroud)

例如:

  1. 测试 - >测试
  2. TeST2 - > test2
  3. Grüßen - > gr ???? en
  4. (§) - >()

你可以看到,3和4没有按预期工作

我该如何解决这个问题?我必须保留特殊字符,但是小写.

Ðаn*_*Ðаn 7

示例代码(如下)tolower显示了如何解决此问题; 你必须使用默认的"C"语言环境以外的东西.

#include <iostream>
#include <cctype>
#include <clocale>

int main()
{
    unsigned char c = '\xb4'; // the character Ž in ISO-8859-15
                              // but ´ (acute accent) in ISO-8859-1 

    std::setlocale(LC_ALL, "en_US.iso88591");
    std::cout << std::hex << std::showbase;
    std::cout << "in iso8859-1, tolower('0xb4') gives "
              << std::tolower(c) << '\n';
    std::setlocale(LC_ALL, "en_US.iso885915");
    std::cout << "in iso8859-15, tolower('0xb4') gives "
              << std::tolower(c) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

您也可以更改std::stringstd::wstring它是Unicode许多C++实现.

wstring NotLowerCase = L"Grüßen";
wstring LowerCase;
for (auto&& ch : NotLowerCase) {
    LowerCase += towlower(ch);
    }
Run Code Online (Sandbox Code Playgroud)

Microsoft的指导是"将字符串规范化为大写 ",因此您可以使用touppertowupper替代.

请记住,逐字符转换可能不适用于某些语言.例如,在德国使用德语,使Grüßen全部为大写,将其转化为GRÜESSEN(尽管现在有一个资本).还有许多其他"问题",如组合字符; 如果你正在用字符串进行真正的"生产"工作,你真的想要一种完全不同的方法.

最后,C++对管理语言环境有更复杂的支持,详见<locale>详见.

  • @Ðan:确实.公平地说,"tolower"已经在对字符集做出假设.中文是经典的反例.ISO-8859描述了一组8位字符集,它们共同涵盖了小写有意义的大多数字母表.但对于UTF-8来说,事情突然变得复杂得多.并且不要让我开始关于特定于语言环境的案例规则; 每条评论我只有600个字符.但要记住一个简短的例子:ß=> SS.即使在8859-1中,也无法用char toupper(char)完成.字符串的长度随着大写字符的变化而变化! (2认同)
  • @TVAvanHesteren你不能真正支持多种语言,除非你根据具体情况支持他们的个人怪癖.您可以支持多种语言中使用的*字符*,但前提是您不以任何方式操纵这些字符.将单词更改为大写然后再更改为小写可以[致命](http://www.theinquirer.net/inquirer/news/1017243/cellphone-localisation-glitch). (2认同)