【问题标题】:How to write Unicode symbol manually into array C如何手动将 Unicode 符号写入数组 C
【发布时间】:2021-12-14 22:34:33
【问题描述】:

为什么这段代码不打印А

int main() {
    char str[] = {0x0, 0x4, 0x1, 0x0};
    write(1, str, 4);
}

而不是A 它只是不打印任何内容并退出。这很奇怪,因为A 的十六进制值是U+0410

【问题讨论】:

  • A 就是0x41。并且字符由 2 个十六进制字符表示,而不是 1。1 个十六进制字符是一个半字节,2 个是一个字节。
  • 这个问题被标记为 UTF8,但这不是将 U+0410 编码为 UTF8 的正确方法。那将被编码为 0xD0 0x90。另见:compart.com/en/unicode/U+0410

标签: c unicode utf-8


【解决方案1】:

关注这个答案https://stackoverflow.com/a/6240184/14926026,你会看到西里尔字母A不是{0x0, 0x4, 0x1, 0x0},而是{ 0xd0, 0x90 }

int main()
{
   char str[] = { 0xd0, 0x90 };
   write(1, str, 2);
}

【讨论】:

【解决方案2】:

您的帖子包含两者

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 没有意义,但你可以。)

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2013-07-19
    • 2017-08-21
    • 2011-08-10
    • 2011-03-17
    相关资源
    最近更新 更多