我需要将通用字符名称 (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 个字节是意外的。\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
到 ü
我错过了什么?
char str[] = "\u00c3\u00bc"; // corresponds to ü
这就是你出错的地方。这不是
ü
。这是ü
,就像输出一样。
ü
的代码是\u00fc
:带有分音符的拉丁文小写字母U
$ uni print c3 bc
CPoint Dec UTF8 HTML Name (Cat)
'¼' U+00BC 188 c2 bc ¼ VULGAR FRACTION ONE QUARTER (Other_Number)
'Ã' U+00C3 195 c3 83 Ã LATIN CAPITAL LETTER A WITH TILDE (Uppercase_Letter)
$ uni id ü
CPoint Dec UTF8 HTML Name (Cat)
'ü' U+00FC 252 c3 bc ü LATIN SMALL LETTER U WITH DIAERESIS (Lowercase_Letter)
你这里写的是
ü
的UTF-8编码,不是UCN。
如果您想手动编码 UTF-8,那么
\x
语法是正确的。您可以将任意字节注入到 C 字符串中。不过,通常您应该更喜欢这里的 \u00fc
语法。