如何在非ASCII字符中使用tolower函数

4

我正在尝试在非ASCII字符上应用小写函数。以下代码在Linux(Ubuntu)环境中无法工作,但在Windows中可以。

int main() {
        std:string data="ŽŠ";
        std::transform(data.begin(), data.end(), data.begin(), ::tolower);
        cout<< data << endl;
        return 0;
}

我尝试安装语言包,但没有成功。有人能帮我看看这段代码缺少了什么吗?


你尝试过更改语言环境吗? - VolAnd
不建议在源文件中使用非ASCII字符创建字符串字面量。请使用正确的转义序列来表示字符串。 - PaulMcKenzie
1个回答

5

::tolower() 函数依赖于 C 库中设置的当前语言环境。默认的 "C" 语言环境只能处理 ASCII 字符。微软很可能使用与用户当前语言环境匹配的不同默认语言环境。这就解释了为什么该代码在 Windows 上能够工作。

使用 ::setlocale() 来设置所需的语言环境,以供 ::tolower() 使用。否则,使用可移植的 Unicode 库,例如 ICU


1
由于字符串直接写在.cpp文件中,问题是否与文件的编码不匹配以及编译器期望的编码不匹配有关呢? - Aconcagua
@Aconcagua:是的,当使用窄字符串时,这也是需要注意的问题。 - Remy Lebeau
我尝试设置语言环境 std::setlocale(LC_ALL,"de_DE"); 并使用 "cin" 而不是直接写入文件,但仍然无法工作。我的操作系统语言环境在 Linux 和 Windows 中均为 "en_US"。 - Nick
setlocale()只影响C函数,而不影响STL类。std::cinstd::cout和其他STL流有自己的区域设置处理方式。请参阅std::locale类和std::basic_ios::imbue()方法。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接