在C中将通用字符名称转换为UTF-8

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

我需要将通用字符名称 (UCN) 数据从数据库转换为 UTF-8。看起来微不足道,但我花了几个小时阅读有关 unicode、UTF-8、宽字符串...但没有任何结果。

例如,以下字符串需要从

D\u00c3\u00bcsseldorf
转换为
Düsseldorf

我尝试过的:

char str[] = "\u00c3\u00bc"; // corresponds to ü
size_t str_len = strlen(str);
for (i = 0; i < str_len; i++)
    printf("%02hhx ", str[i]);
printf("- %zu - %s\n", str_len, str); // prints "c3 83 c2 bc - 4 - ü"

c3
是正确的,但接下来的 3 个字节是意外的。
编译器仅考虑 UCN 的第一部分 (
\u00c3
)。

wchar_t wcs[] = L"\u00c3\u00bc";
size_t wcs_len = wcslen(wcs);
for (i = 0; i < wcs_len; i++)
    printf("%02hhx ", wcs[i]);
printf("- %zu - %ls\n", wcs_len, wcs); // prints "c3 bc - 2 - ü"

看起来更好了。
考虑了整个UCN(

c3 bc
),但还是没有
ü

char str[] = "\xc3\xbc";
size_t str_len = strlen(str);
for (i = 0; i < str_len; i++)
    printf("%02hhx ", str[i]);
printf("- %zu %s\n", str_len, str); // prints "c3 bc - 2 ü"

这会打印

ü
,但我将
str
从 UCN 修改为十六进制代码。

\u00c3\u00bc
ü
我错过了什么?

c unicode utf-8 wchar-t
1个回答
0
投票
char str[] = "\u00c3\u00bc"; // corresponds to ü

这就是你出错的地方。这不是

ü
。这是
ü
,就像输出一样。

ü
的代码是
\u00fc
带有分音符的拉丁文小写字母U

$ uni print c3 bc
     CPoint  Dec    UTF8        HTML       Name (Cat)
'¼'  U+00BC  188    c2 bc       &frac14;   VULGAR FRACTION ONE QUARTER (Other_Number)
'Ã'  U+00C3  195    c3 83       &Atilde;   LATIN CAPITAL LETTER A WITH TILDE (Uppercase_Letter)

$ uni id ü
     CPoint  Dec    UTF8        HTML       Name (Cat)
'ü'  U+00FC  252    c3 bc       &uuml;     LATIN SMALL LETTER U WITH DIAERESIS (Lowercase_Letter)

你这里写的是

ü
的UTF-8编码,不是UCN。

如果您想手动编码 UTF-8,那么

\x
语法是正确的。您可以将任意字节注入到 C 字符串中。不过,通常您应该更喜欢这里的
\u00fc
语法。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.