我在 VC++ MFC 中将 unicode 字符转换为小写字母时遇到问题。我在 CString 变量中有 unicode 字符。所以,使用英语 MakeLower() 工作正常,我得到小写字母。但它无法将 unicode 字符转换为小写.我确实尝试过STL算法变换:
std::字符串数据 = "ИИИЛЛЛЛ"; //保加利亚字符
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
但它无法加载 unicode 字符,我得到“???”符号代替 unicode 字符。
您能否告诉我是否有unicode字符的解决方案。我不喜欢使用boost库。提前谢谢!
如果您的项目使用 Unicode 字符集(项目属性),
CString::MakeLower()
应该可以工作 -- CString s1(_T("ABC")), s2;
s2 = s1.MakeLower();
ASSERT(s2 == _T("abc"));
编辑:CString::MakeLower() 确实更改了字符串的内容,它还返回对转换后的字符串的引用
尝试
std::wstring data = L"ИИИЛЛЛЛ"; // Wide chars
std::transform(data.begin(), data.end(), data.begin(), std::tolower<wchar_t>);
我在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 -> 𐍈ƕƕƕƕƕƕƕ