我一直试图用不同的语言环境调用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 ++编译(如果它与它有关)。
我想知道这是否是实现我想要做的正确方法,或者还有其他方法可以做到。
谢谢!
答案 0 :(得分:2)
与来自C的tolower
版本(将字符转换为unsigned
字符然后转换为int
)不同,<locale>
版本的tolower
版本意味着直接用字符调用。它被定义为使用区域设置的std::ctype<charT>
方面,并且只有两个std::ctype
特化guaranteed to be available是std::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