将德语字母转换为大写字母无效

Converting German Letters to Uppercase won't work

这段代码有什么问题?如果字符串中有一个字母,如 åäö,它不会像我想要的那样使它们变成大写。有什么我想念的吗?

在 C++ 中是否有任何方法可以通过库以某种方式将德语字母转换为大写?

string makeUpperCase(string c)
{
    transform(c.begin(), c.end(), c.begin(), ::toupper);
    while(c.find("Ä") != string::npos)
    {
        c.replace(c.find("Ä"), 2, "ä");
    }
    while(c.find("Å") != string::npos)
    {
        c.replace(c.find("Å"), 2, "å");
    }
    while(c.find("Ö") != string::npos)
    {
        c.replace(c.find("Ö"), 2, "ö");
    }

    return c;
}

您正在搜索 大写 字母并将其替换为 小写 字母。

如果你想把字母变成大写,你必须做相反的事情。

string makeUpperCase(string c)
{
        transform(c.begin(), c.end(), c.begin(), ::toupper);
        while(c.find("ä") != string::npos)
        {
                c.replace(c.find("ä"), 2, "Ä");
        }
        while(c.find("å") != string::npos)
        {
                c.replace(c.find("å"), 2, "Å");
        }
        while(c.find("ö") != string::npos)
        {
                c.replace(c.find("ö"), 2, "Ö");
        }

        return c;
}

在很多平台上,函数toupper也可以处理德文字符。但是,在默认的 "C" 语言环境中,它只将字符 azAZ 视为字母。因此,您必须将语言环境更改为德语,以便该函数也将德语字母视为有效的字母。您可以使用函数 std::setlocale.

来做到这一点

ISO C 标准未指定哪些语言环境可用以及它们的名称是什么。但是,在 Microsoft Windows 上使用 Microsoft Visual Studio,你可以写

std::setlocale( LC_ALL, "de-DE" );

将区域设置设置为德语。

这是一个示例程序:

#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
#include <clocale>

int main( void )
{
    //define text string with German-specific characters
    std::string str{ "This is a test string with ä, ö and ü." };

    //set the locale to German
    std::setlocale( LC_ALL, "de-DE" );

    //convert string to upper-case
    std::transform( str.begin(), str.end(), str.begin(), static_cast<int(*)(int)>(std::toupper) );

    //output converted string
    std::cout << str << '\n';
}

该程序在该平台上具有以下输出:

THIS IS A TEST STRING WITH Ä, Ö AND Ü.

如您所见,德文字母也已制作 upper-case。

要在 Linux 上将语言环境设置为德语,请参阅 the Linux documentation for setlocale