Unicode 字符的小写
Posted
技术标签:
【中文标题】Unicode 字符的小写【英文标题】:Lowercase of Unicode character 【发布时间】:2016-03-29 18:04:06 【问题描述】:我正在处理一个需要从unicode text
获取数据的C++
项目。
我有一个问题,我不能降低一些unicode character
。
我使用 wchar_t
存储从 unicode 文件读取的 unicode 字符。之后,我使用_wcslwr
降低wchar_t
字符串。还有很多情况还是不低如:
Đ Â Ă Ê Ô Ơ Ư Ấ Ắ Ế Ố Ớ Ứ Ầ Ằ Ề Ồ Ờ Ừ Ậ Ặ Ệ Ộ Ợ Ự
哪个小写是:
đ â ă ê ô ơ ư ấ ắ ế ố ớ ứ ầ ằ ề ồ ờ ừ ậ ặ ệ ộ ợ ự
我尝试了tolower
,但还是不行。
【问题讨论】:
欢迎堆栈溢出!! 标准库无法正确执行此操作,您需要一个像样的库。还要处理更棘手的极端情况,例如ß
的小写是ss
,从一个字符到两个字符。 ICU 库在 C++ 领域非常流行。
如果你需要转换成lower的字符数很少,你可以定义自己的映射数组,而不是使用库。
【参考方案1】:
如果您只调用tolower
,它将从标题clocale
调用std::tolower
,这将调用tolower
仅用于ansi 字符。
正确的签名应该是:
template< class charT >
charT tolower( charT ch, const locale& loc );
下面是两个运行良好的版本:
#include <iostream>
#include <cwctype>
#include <clocale>
#include <algorithm>
#include <locale>
int main()
std::setlocale(LC_ALL, "");
std::wstring data = L"Đ Â Ă Ê Ô Ơ Ư Ấ Ắ Ế Ố Ớ Ứ Ầ Ằ Ề Ồ Ờ Ừ Ậ Ặ Ệ Ộ Ợ Ự";
std::wcout << data << std::endl;
// C std::towlower
for(auto c: data)
std::wcout << static_cast<wchar_t>(std::towlower(c));
std::wcout << std::endl;
// C++ std::tolower(charT, std::locale)
std::locale loc("");
for(auto c: data)
// This is recommended
std::wcout << std::tolower(c, loc);
std::wcout << std::endl;
return 0;
参考:
towlower
tolower
【讨论】:
这对我很有帮助。非常感谢。以上是关于Unicode 字符的小写的主要内容,如果未能解决你的问题,请参考以下文章
C ++ 11字符串开头的不区分大小写的比较(unicode)
C/C++ _wcsupr_s 函数 – unicode 字符串小写转大写