9

我一直在尝试std::tolower()使用不同的语言环境进行呼叫,但似乎出了点问题。我的代码如下:

int main() {
    std::locale::global(std::locale("es_ES.UTF-8"));
    std::thread(&function, this); // Repeated some times
    // wait for threads
}

void function() {
    std::string word = "HeÉllO";
    std::transform(word.begin(), word.end(), word.begin(), cToLower);
}

int cToLower(int c) {
    return std::tolower(c, std::locale());
}

所以当我尝试执行这个程序时,我得到:

terminate called after throwing an instance of 'std::bad_cast'
terminate called recursively
  what():  std::bad_cast
Aborted (core dumped)

虽然执行return std::tolower(c);工作正常,但它只是将“标准”字符转换为较低的字符,而不是É.

我有一些线程同时执行相同的功能,使用 C++11 并使用 g++ 编译(以防它与它有关)。

我想知道这是否是实现我想做的正确方法,或者还有其他方法。

谢谢!

4

2 回答 2

3

tolower来自 C 的版本不同(它将字符转换为unsignedchar 然后转换为int),<locale>版本的tolower意思是直接用字符调用。它被定义为使用std::ctype<charT>语言环境的方面,并且唯一保证可用std::ctype的两个特化是和。因此:std::ctype<char>std::ctype<wchar_t>

char cToLower(char c) {
    return std::tolower(c, std::locale());
}

请注意,这仍然是一个char逐个char变换;如果字符占用超过一个字节,则不太可能正确处理它。

于 2017-02-27T14:18:43.480 回答
1

检查您尝试使用的语言环境是否安装在您的系统上。例如,我必须在下面的代码停止崩溃之前安装西班牙语语言环境。此外,您可以wstring改为使用。 更新:经过一番挖掘,这里是使用的很好的解释wstring- 所有的缺点和过程(主要是缺点)。

#include <thread>
#include <locale>
#include <algorithm> 
#include <iostream>

//forward declaration
void function();

int main() {
    std::locale::global(std::locale("es_ES.utf8"));
    std::thread test(&function);
    test.join();
}

wchar_t cToLower(wchar_t c) {        
    return std::tolower(c, std::locale());    
}

void function() {
    std::wstring word = L"HeÉllO";
    std::transform(word.begin(), word.end(), word.begin(), cToLower);
    std::wcout << word;
}

输出:

heéllo
于 2017-02-26T15:32:30.143 回答