使用自定义区域设置的{C ++ String to smallcase

时间:2017-02-26 14:57:58

标签: c++ locale tolower

我一直试图用不同的语言环境调用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 ++编译(如果它与它有关)。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

与来自C的tolower版本(将字符转换为unsigned字符然后转换为int)不同,<locale>版本的tolower版本意味着直接用字符调用。它被定义为使用区域设置的std::ctype<charT>方面,并且只有两个std::ctype特化guaranteed to be availablestd::ctype<char>std::ctype<wchar_t>。因此:

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

请注意,这仍然是char - by - char转换;如果字符占用多个字节,则不太可能正确处理它。

答案 1 :(得分:1)

检查系统上是否安装了您尝试使用的区域设置。例如,我必须在下面的代码停止崩溃之前安装西班牙语语言环境。 此外,您可以使用wstring更新:经过一些挖掘here是使用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