C 字符串通过自定义语言环境进行小写
C++ String to lowercase with custom locale
我一直在尝试使用不同的语言环境调用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
相关文章:
- "C.UTF-8" C++ Windows 上的语言环境?
- 有没有办法为macOS上的C++程序指定自定义语言环境目录
- 跨语言共享环境变量
- 如何使用特定语言环境将 u32string (char32_t) 大写?
- 如何在 c++ 中处理 ifstream、cout 等的多个语言环境
- std::ifstream 在二进制模式下,语言环境在 C++ 中
- 如何更改CIN的语言环境
- C 字符串通过自定义语言环境进行小写
- swprintf语言环境
- std::wstring中ASCII符号的字节表示,具有不同的语言环境
- 语言环境"en_US"中 std::time_get::get_time() 的正确时间格式是什么?
- 在QT中更改语言环境
- 为什么非unicode应用程序系统语言环境使Unicode字体具有错误显示的符号字符
- 是否可以让boost语言环境边界分析在撇号上进行拆分
- 当 matlab 找不到语言环境数据库时,这意味着什么?
- C++:sprintf 考虑哪个语言环境
- 如何使用德语语言环境在gdb中设置双变量
- 如何本地加载XML语言环境文件
- std:: lower的行为在不同的语言环境中是如何变化的?
- Boost语言环境转换