C++;减少特殊字符,如ü; 我在用C++中的ToWORE()函数转换字符串到小写时有困难。对于普通字符串,它可以按预期工作,但是特殊字符无法成功转换

C++;减少特殊字符,如ü; 我在用C++中的ToWORE()函数转换字符串到小写时有困难。对于普通字符串,它可以按预期工作,但是特殊字符无法成功转换,c++,character-encoding,htmlspecialchars,C++,Character Encoding,Htmlspecialchars,我如何使用我的功能: string NotLowerCase = "Grüßen"; string LowerCase = ""; for (unsigned int i = 0; i < NotLowerCase.length(); i++) { LowerCase += tolower(NotLowerCase[i]); } string NotLowerCase=“Grüßen”; 字符串小写=”; for(无符号整数i=0;i测试 TeST2->TeST2 Grü

我如何使用我的功能:

string NotLowerCase = "Grüßen";
string LowerCase = "";
for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
    LowerCase += tolower(NotLowerCase[i]);
    }
string NotLowerCase=“Grüßen”;
字符串小写=”;
for(无符号整数i=0;i
例如:

  • 测试->测试
  • TeST2->TeST2
  • Grüßen->Gr???en
  • (§)->()
  • 3和4没有如您所看到的那样正常工作

    如何解决此问题?我必须保留特殊字符,但必须小写。

    中的示例代码(下面)显示了如何解决此问题;您必须使用默认“C”语言环境以外的其他语言环境

    Microsoft提供的指南为“”,因此您可以使用或

    请记住,对于某些语言,逐字符转换可能无法很好地工作。例如,使用德语作为德语口语,使Grüßen全大写将其转换为GrÜESSEN(尽管现在有一个)。还有许多其他的“问题”,比如组合字符;如果您正在使用字符串进行真正的“生产”工作,那么您确实需要一种完全不同的方法

    <>最后,C++对管理区域设置有更为成熟的支持,请参阅详细信息。

    < P>使用ASCII

    string NotLowerCase = "Grüßen";
    string LowerCase = "";
    for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
        if(NotLowerCase[i]<65||NotLowerCase[i]>122)
        {
            LowerCase+='?';
        }
        else
            LowerCase += tolower(NotLowerCase[i]);
    }
    
    string NotLowerCase=“Grüßen”;
    字符串小写=”;
    for(无符号整数i=0;i
    我认为最方便的方法是使用用户选择的语言环境,这是通过将语言环境设置为
    “”
    (空字符串)实现的

    这将语言环境设置为运行程序时使用的任何语言环境,并影响在多字节字符和宽字符串字符之间转换的标准字符转换例程(&)

    然后,您可以使用这些函数将系统/用户选择的多字节字符(如
    UTF-8
    )转换为系统标准的全字符代码,这些字符代码可以在
    std::tolower
    等函数中使用,这些函数一次只能处理一个字符

    这一点很重要,因为像
    UTF-8
    这样的多字节字符集不能使用像
    std::tolower()
    这样的单字符操作进行转换

    将宽字符串版本转换为大写/小写后,可以将其转换回系统/用户多字节字符集,以便打印到控制台

    // Convert from multi-byte codes to wide string codes
    std::wstring mb_to_ws(std::string const& mb)
    {
        std::wstring ws;
        std::mbstate_t ps{};
        char const* src = mb.data();
    
        std::size_t len = 1 + mbsrtowcs(0, &src, 3, &ps);
    
        ws.resize(len);
        src = mb.data();
    
        mbsrtowcs(&ws[0], &src, ws.size(), &ps);
    
        if(src)
            throw std::runtime_error("invalid multibyte character after: '"
                + std::string(mb.data(), src) + "'");
    
        ws.pop_back();
    
        return ws;
    }
    
    // Convert from wide string codes to multi-byte codes
    std::string ws_to_mb(std::wstring const& ws)
    {
        std::string mb;
        std::mbstate_t ps{};
        wchar_t const* src = ws.data();
    
        std::size_t len = 1 + wcsrtombs(0, &src, 0, &ps);
    
        mb.resize(len);
        src = ws.data();
    
        wcsrtombs(&mb[0], &src, mb.size(), &ps);
    
        if(src)
            throw std::runtime_error("invalid wide character");
    
        mb.pop_back();
    
        return mb;
    }
    
    int main()
    {
        // set locale to the one chosen by the user
        // (or the one set by the system default)
        std::locale::global(std::locale(""));
    
        try
        {
            string NotLowerCase = "Grüßen";
    
            std::cout << NotLowerCase << '\n';
    
            // convert system/user multibyte character codes
            // to wide string versions
            std::wstring ws1 = mb_to_ws(NotLowerCase);
            std::wstring ws2;
    
            for(unsigned int i = 0; i < ws1.length(); i++) {
                // use the system/user locale
                ws2 += std::tolower(ws1[i], std::locale("")); 
            }
    
            // convert wide string character codes back
            // to system/user multibyte versions
            string LowerCase = ws_to_mb(ws2);
    
            std::cout << LowerCase << '\n';
        }
        catch(std::exception const& e)
        {
            std::cerr << e.what() << '\n';
            return EXIT_FAILURE;
        }
        catch(...)
        {
            std::cerr << "Unknown exception." << '\n';
            return EXIT_FAILURE;
        }
    
        return EXIT_SUCCESS;
    }
    
    //从多字节码转换为宽字符串码
    std::wstring mb_到w(std::string const&mb)
    {
    std::wstring-ws;
    std::mbstate_t ps{};
    char const*src=mb.data();
    标准:尺寸长度=1+mbsrtowcs(0,&src,3,&ps);
    ws.resize(len);
    src=mb.data();
    mbsrtowcs(&ws[0],&src,ws.size(),&ps);
    if(src)
    抛出std::runtime_错误(“后面的多字节字符无效:”
    +std::string(mb.data(),src)+“'”;
    ws.pop_back();
    返回ws;
    }
    //从宽字符串代码转换为多字节代码
    std::string ws_to_mb(std::wstring const&ws)
    {
    std::字符串mb;
    std::mbstate_t ps{};
    wchar_t const*src=ws.data();
    标准::大小长度=1+WCSRM(0,&src,0,&ps);
    mb.调整大小(len);
    src=ws.data();
    wcsrtombs(&mb[0],&src,mb.size(),&ps);
    if(src)
    抛出std::runtime_错误(“无效的宽字符”);
    mb.pop_back();
    返回mb;
    }
    int main()
    {
    //将区域设置设置为用户选择的区域设置
    //(或系统默认设置的)
    std::locale::global(std::locale(“”);
    尝试
    {
    字符串NotLowerCase=“Grüßen”;
    
    std::请注意,这适用于ISO-8859-*,但不适用于Unicode。由于它被标记为“htmlspecialcharacters”,Unicode是一个合理的假设。哇,这是toupper->towupper实现的。(我当然将其修改为lower,但现在似乎可以工作)谢谢你的支持!@nÐаn:的确。公平地说,tolower
    已经在对字符集进行假设。中文是经典的反例。ISO-8859描述了一组8位字符集,它们共同覆盖了大多数小写字母表。但对于UTF-8来说,情况突然变得更糟了e复杂。不要让我开始了解特定于语言环境的大小写规则;我每个注释只有600个字符。不过,要记住一个简短的示例:ß=>SS。即使在8859-1中,也不能用char-toupper(char)实现这一点。字符串的长度随大写字母的变化而变化!@TVAvanHesteren您不能真正支持多种语言,除非您根据具体情况支持它们各自的特性。您可以支持在多种语言中使用的字符,但前提是您不以任何方式操纵这些字符。将单词改为大写字母,然后再改回大写字母小写可以是。那么,你建议如何解决这个问题或解决这个问题?我需要问题中所述的小写特殊字符。这只是用一个“有效”的问号来代替它们,而这个问号不是要求的。谢谢你的输入。你是否意识到这是不可能正确的,因为
    ß
    translates到
    SS
    ,而
    SS
    可以根据上下文翻译成
    ß
    SS
    ?是的,我理解并且已经删除了我的评论,很好的回答,伙计们,请继续保持。另外,如果没有这种情况发生,只保留原来的正常“单词”,使用什么是安全的语言?e、 为什么人们总是把完全正常的字母称为“特殊字符”?
    string NotLowerCase = "Grüßen";
    string LowerCase = "";
    for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
        if(NotLowerCase[i]<65||NotLowerCase[i]>122)
        {
            LowerCase+='?';
        }
        else
            LowerCase += tolower(NotLowerCase[i]);
    }
    
    std::locale::global(std::locale("")); 
    
    // Convert from multi-byte codes to wide string codes
    std::wstring mb_to_ws(std::string const& mb)
    {
        std::wstring ws;
        std::mbstate_t ps{};
        char const* src = mb.data();
    
        std::size_t len = 1 + mbsrtowcs(0, &src, 3, &ps);
    
        ws.resize(len);
        src = mb.data();
    
        mbsrtowcs(&ws[0], &src, ws.size(), &ps);
    
        if(src)
            throw std::runtime_error("invalid multibyte character after: '"
                + std::string(mb.data(), src) + "'");
    
        ws.pop_back();
    
        return ws;
    }
    
    // Convert from wide string codes to multi-byte codes
    std::string ws_to_mb(std::wstring const& ws)
    {
        std::string mb;
        std::mbstate_t ps{};
        wchar_t const* src = ws.data();
    
        std::size_t len = 1 + wcsrtombs(0, &src, 0, &ps);
    
        mb.resize(len);
        src = ws.data();
    
        wcsrtombs(&mb[0], &src, mb.size(), &ps);
    
        if(src)
            throw std::runtime_error("invalid wide character");
    
        mb.pop_back();
    
        return mb;
    }
    
    int main()
    {
        // set locale to the one chosen by the user
        // (or the one set by the system default)
        std::locale::global(std::locale(""));
    
        try
        {
            string NotLowerCase = "Grüßen";
    
            std::cout << NotLowerCase << '\n';
    
            // convert system/user multibyte character codes
            // to wide string versions
            std::wstring ws1 = mb_to_ws(NotLowerCase);
            std::wstring ws2;
    
            for(unsigned int i = 0; i < ws1.length(); i++) {
                // use the system/user locale
                ws2 += std::tolower(ws1[i], std::locale("")); 
            }
    
            // convert wide string character codes back
            // to system/user multibyte versions
            string LowerCase = ws_to_mb(ws2);
    
            std::cout << LowerCase << '\n';
        }
        catch(std::exception const& e)
        {
            std::cerr << e.what() << '\n';
            return EXIT_FAILURE;
        }
        catch(...)
        {
            std::cerr << "Unknown exception." << '\n';
            return EXIT_FAILURE;
        }
    
        return EXIT_SUCCESS;
    }