如何为 unicode 字符制作小写字母

问题描述 投票:0回答:3

我在 VC++ MFC 中将 unicode 字符转换为小写字母时遇到问题。我在 CString 变量中有 unicode 字符。所以,使用英语 MakeLower() 工作正常,我得到小写字母。但它无法将 unicode 字符转换为小写.我确实尝试过STL算法变换:

std::字符串数据 = "ИИИЛЛЛЛ"; //保加利亚字符

std::transform(data.begin(), data.end(), data.begin(), ::tolower);

但它无法加载 unicode 字符,我得到“???”符号代替 unicode 字符。

您能否告诉我是否有unicode字符的解决方案。我不喜欢使用boost库。提前谢谢!

c++ c visual-c++ mfc
3个回答
3
投票

如果您的项目使用 Unicode 字符集(项目属性),

CString::MakeLower()
应该可以工作 -- 注意,这不会转换字符串的内容,它会返回一个新字符串,请参阅 这篇 MSDN 文章

CString s1(_T("ABC")), s2;
s2 = s1.MakeLower();
ASSERT(s2 == _T("abc"));   

编辑:CString::MakeLower() 确实更改了字符串的内容,它还返回对转换后的字符串的引用


1
投票

尝试

std::wstring data = L"ИИИЛЛЛЛ"; // Wide chars

std::transform(data.begin(), data.end(), data.begin(), std::tolower<wchar_t>);

0
投票

我在IDN2文档中找不到单词lower,但注意到域名被转换为小写。考虑这个 C 代码片段:

#include <stdio.h>
#include <idn2.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; ++i)
    {
        char *out = NULL, *out2 = NULL;
        int rtc = idn2_to_ascii_8z(argv[i], &out, 0);
        int rtc2 = rtc == 0? idn2_to_unicode_8z8z(out, &out2, 0): -1;
        printf("%2d/%2d  %s -> %s -> %s\n", rtc, rtc2,
            argv[i], out? out: "NULL", out2? out2: "-");
        free(out);
        free(out2);
    }

    return 0;
}

它需要一些奇特的字符,例如hwair,但不是简单的°

ale@alenovo:~/tmp$ gcc -W -Wall -g -O0 lower.c -lidn2
ale@alenovo:~/tmp$ ./a.out ASCII àÃĈOÖÖ°o àÃĈOÖÖo ИИИЛЛЛЛ 𐍈ǶǶǶǶƕƕƕ
 0/ 0  ASCII -> ascii -> ascii
-304/-1  àÃĈOÖÖ°o -> NULL -> -
 0/ 0  àÃĈOÖÖo -> xn--oo-iiam0ha4k -> àãĉoööo
 0/ 0  ИИИЛЛЛЛ -> xn--h1aaamaaa -> ииилллл
 0/ 0  𐍈ǶǶǶǶƕƕƕ -> xn--6haaaaaaa57883c -> 𐍈ƕƕƕƕƕƕƕ
© www.soinside.com 2019 - 2024. All rights reserved.