9

该功能towlower()在 Visual Studio 2012 中似乎不起作用。这是一个示例:

#include <string>
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <wctype.h>

using namespace std;

int main()
{
    _setmode(_fileno(stdout), _O_U8TEXT);
    wcout << (wchar_t)towlower(L'Я') << endl;
    system("pause");
    return 0;
}

字符保持大写。以前在这里问过类似的问题,但我找不到任何解决方案。

我可以使用另一种方法更改为小写吗?

4

3 回答 3

6

使用支持语言环境的版本tolower,但不要忘记同时设置 C 语言环境。

例如:

#include <clocale>
#include <locale>
#include <iostream>

int main()
{
    std::setlocale(LC_CTYPE, "");
    std::wcout << L"The letter is: " << L'Я' << L" => "
               << std::tolower(L'Я', std::locale("")) << std::endl;
}

这打印:

The letter is: Я => я

在 iostreams 中使用 locales 是一件棘手的事情,而这背后隐藏着一个完整的潘多拉魔盒。例如,您可以为流注入语言环境,并且可以一次管理多个语言环境,特别是每个线程可以有一个(这对于有状态的字符串编码转换可能是必需的)......有人应该写一本关于它的书(或者改用 Boost.Locale)。

于 2013-04-08T22:15:23.320 回答
5

我看到了两种可能性。第一个是语言环境设置不正确。来自MSDN

的大小写转换towlower是特定于语言环境的。仅更改与当前语言环境相关的字符以防万一。没有_l后缀的函数使用当前设置的语言环境。

第二个是源文件编码。L'Я'根据您的源文件的编码方式,可能意味着不同的事情。例如,如果您将它放在UTF-8. 确保你有它UTF-16。或者为了消除任何可能的混淆,像这样'\u042F'

更新:在第二个想法这整个L业务是棘手的。如果编译器正确理解编码,例如通过 BOM,它可能适用于UTF-8或任何其他编码。重要的是它应该知道编码是什么。它必须是非常具体的实现。

另一个更新:要解决此问题,请尝试通过以下方式设置语言环境:

_wsetlocale(LC_ALL, L"ru-RU");

或使用将语言环境作为参数的版本 ( _towlower_l)。

此外,还有一个编译指示告诉编译器如何处理文件中的非 ASCII 字符串文字。

于 2013-04-08T22:13:38.310 回答
0

它造成的伤害是否低于更高的伤害?j/k。我不熟悉反转的 R,但我知道如果字符没有等效的小写字母,to(w)lower 将返回原始字符。http://en.cppreference.com/w/c/string/wide/towlower

于 2013-04-08T22:08:51.020 回答