2016-06-13 52 views
4

我试图在非ASCII字符上应用较低的函数。以下代码在Linux(Ubuntu)环境中不起作用,但在Windows中工作。如何对非ASCII字符使用tolower函数

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

我尝试安装语言包,但没有工作。可以有人帮助我在这段代码中缺少什么?

+0

您是否尝试过语言环境更改? – VolAnd

+0

使用非ASCII字符创建字符串文字并且在源文件中包含这些字符串不是一个好主意。使用表示字符串的正确转义序列创建文字。 – PaulMcKenzie

回答

5

::tolower()依赖C库中设置的当前语言环境。默认的"C"区域设置只能保证处理ASCII字符。微软可能会使用与用户当前语言环境相匹配的其他默认语言环境。这将解释为什么代码能够在Windows上工作。

使用::setlocale()::tolower()设置所需的区域设置以供使用。否则,请使用便携式Unicode库,如ICU

+1

由于字符串是直接写入.cpp文件 - 问题可能与文件的编译器与预期的编译器之间的编码不匹配有关吗? – Aconcagua

+0

@Aconcagua:是的,这也是使用窄字符串时需要注意的问题。 –

+0

我试过设置locale的'std :: setlocale(LC_ALL,“de_DE”);'并使用“cin”而不是直接写入文件,但仍然不起作用。我的操作系统语言环境在Linux和Windows中均为“en_US”。 – Nick