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 字符串小写转大写

unicode排序规则,汉字怎么区分大小写,区分重音,区分假名,区分宽度

Python中Unicode字符串

Unicode字符串

JS - 字符编码 (ASCII,Unicode,UTF-8)