C 字符串通过自定义语言环境进行小写

C++ String to lowercase with custom locale

本文关键字:环境 语言 字符串 自定义      更新时间:2023-10-16

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

我想知道这是实施我想做的事情的正确方法,还是还有其他一些方法。

谢谢!

与来自C的tolower版本不同(将字符转换为unsigned char,然后转换为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 -BY- char转换;如果角色占据多个字节,则不太可能正确处理它。

检查您是否要在系统上安装的语言环境。例如,在下面的代码停止崩溃之前,我必须安装西班牙语言环境。另外,您可以使用wstring Update :在此处进行了一些挖掘之后,是使用wstring的很好的解释 - 所有CONS和PROCS(主要是CONS)。

#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