C语言 如何制作烟雾弹

nhaq1z21  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(79)

我在VC++ MFC中将Unicode字符转换为小写字母时遇到问题。我在CString Variable.so中有Unicode字符,英语MakeLower()工作正常,我得到了小写字母。但它不能将Unicode字符转换为小写字母。我尝试了STL算法转换:
std::string data =“默认值";//Bulgerian chars
std::transform(data.开始(),data.end(),data.开始(),::tolower);
但它无法加载Unicode字符,我得到“?"?”符号代替unicode字符。
你能让我知道是否有解决unicode字符的方法吗?我不喜欢使用boost库。提前感谢!

vql8enpb

vql8enpb1#

如果您的项目使用Unicode字符集(项目属性),CString::MakeLower()应该可以工作-注意,这不会转换字符串的内容,它返回一个新的字符串,请参阅this MSDN article

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

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

qhhrdooz

qhhrdooz2#

尝试

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

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

xeufq47z3#

我在IDN2 documentation中找不到 lower 这个词,但注意到域名被转换为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 -> 𐍈ƕƕƕƕƕƕƕ

相关问题