如何手动将 Unicode 符号写入数组 C
How to write Unicode symbol manually into array C
为什么此代码不打印 А
?
int main() {
char str[] = {0x0, 0x4, 0x1, 0x0};
write(1, str, 4);
}
而不是 A
它只是不打印任何内容并退出。这很奇怪,因为 A
的十六进制值是 U+0410.
按照这个答案,你会发现西里尔字母A不是{0x0, 0x4, 0x1, 0x0}
,而是{ 0xd0, 0x90 }
int main()
{
char str[] = { 0xd0, 0x90 };
write(1, str, 2);
}
您的post同时包含
U+000041 拉丁文大写字母 A (A)
和
U+000410 西里尔大写字母 A (А)
无论哪种方式,您都需要使用终端期望的编码对字符进行编码。假设终端需要 UTF-8,
$ perl -e'use utf8; $_ = "A"; utf8::encode($_); printf "%v02X", $_;'
41
$ perl -e'use utf8; $_ = "\N{U+41}"; utf8::encode($_); printf "%v02X", $_;'
41
$ perl -e'use utf8; $_ = chr(0x41)"; utf8::encode($_); printf "%v02X", $_;'
41
$ perl -e'use utf8; $_ = "А"; utf8::encode($_); printf "%v02X", $_;'
D0.90
$ perl -e'use utf8; $_ = "\N{U+410}"; utf8::encode($_); printf "%v02X", $_;'
D0.90
$ perl -e'use utf8; $_ = chr(0x410); utf8::encode($_); printf "%v02X", $_;'
D0.90
所以你想要
const char *str = "\x41"; // { 0x41, 0 }
printf("%s\n", str); // write(1, str, 1);
或
const char *str = "\xD0\x90"; // { 0xD0, 0x90, 0 }
printf("%s\n", str); // write(1, str, 2);
(没有必要使用 write
,但你可以。)
为什么此代码不打印 А
?
int main() {
char str[] = {0x0, 0x4, 0x1, 0x0};
write(1, str, 4);
}
而不是 A
它只是不打印任何内容并退出。这很奇怪,因为 A
的十六进制值是 U+0410.
按照这个答案,你会发现西里尔字母A不是{0x0, 0x4, 0x1, 0x0}
,而是{ 0xd0, 0x90 }
int main()
{
char str[] = { 0xd0, 0x90 };
write(1, str, 2);
}
您的post同时包含
U+000041 拉丁文大写字母 A (A)
和
U+000410 西里尔大写字母 A (А)
无论哪种方式,您都需要使用终端期望的编码对字符进行编码。假设终端需要 UTF-8,
$ perl -e'use utf8; $_ = "A"; utf8::encode($_); printf "%v02X", $_;'
41
$ perl -e'use utf8; $_ = "\N{U+41}"; utf8::encode($_); printf "%v02X", $_;'
41
$ perl -e'use utf8; $_ = chr(0x41)"; utf8::encode($_); printf "%v02X", $_;'
41
$ perl -e'use utf8; $_ = "А"; utf8::encode($_); printf "%v02X", $_;'
D0.90
$ perl -e'use utf8; $_ = "\N{U+410}"; utf8::encode($_); printf "%v02X", $_;'
D0.90
$ perl -e'use utf8; $_ = chr(0x410); utf8::encode($_); printf "%v02X", $_;'
D0.90
所以你想要
const char *str = "\x41"; // { 0x41, 0 }
printf("%s\n", str); // write(1, str, 1);
或
const char *str = "\xD0\x90"; // { 0xD0, 0x90, 0 }
printf("%s\n", str); // write(1, str, 2);
(没有必要使用 write
,但你可以。)