Jacobo Córdova Asked: 2020-05-20 11:49:29 +0800 CST 2020-05-20 11:49:29 +0800 CST 2020-05-20 11:49:29 +0800 CST 如何使用 printf 打印 Unicode 字符?( printf(" \u0305") = ╠à ) 772 我已阅读有关 UTF-8 和 Unicode 的信息,这些字符是什么意思? 但是,我在 C 中有一个代码,当我这样做时: printf(" \u0305"); 结果我得到=╠à 因为?也很重要,我该如何解决?谢谢 c 1 Answers Voted Best Answer leonbloy 2020-05-20T12:13:10+08:002020-05-20T12:13:10+08:00 首先,您不需要使用 printf。转义序列\u由 C 编译器解释(而不是标准库,在调用 时printf),就像序列一样\n。如果你 print 也是一样的puts(" \u0305")。 现在,当我们编写代码时,\u0305我们告诉 C 编译器:在这个字符串中分配一个字节作为前导空格,然后是 Unicode 代码点编号 0x 0305(十六进制)。这如何存储在字符串中(在编译时,从源代码转换为可执行或二进制对象时),取决于locale系统的设置 ( )。如果您使用 UTF-8,它将是 - 在这种情况下 - 两个字节。 在打印时(到控制台或文件),这些字节将按原样输出。为了让您的眼睛将其视为 Unicode 所声称的字符,控制台或文件查看器必须与编译器一致。 总的来说,必须满足几个条件: C 编译器必须理解序列\u (几乎所有序列都会发生这种情况) 编译器找到的语言环境必须是某个 Unicode 变体(通常是 UTF-8) 如果您在控制台上看到它:您的控制台必须设置为某种支持 Unicode 的模式(通常是 UTF-8) 您的控制台字体必须包含该特定字符的字形(Unicode 有超过 120,000 个字符,不能指望正确查看所有字符) 我猜你的情况是: 您的编译器正在使用 UTF-8 。字符号 0305 被编码为字节序列0xCC 0x85 您的控制台没有使用 UTF.8,而是使用扩展的 ASCII 模式(每个字符一个字节) - 以及一种相当老式的模式CP437,即DOS中使用的模式。如果您在表中查找(两个!)字符 0xCC 和 0x85,您会发现它们与您所看到的相对应。 所以,你应该做的是设置你的控制台/终端,以便在将字节解释为文本时(每个控制台都会这样做,我们不时意识到这一点很重要)它使用 UTF-8。 更一般地说,程序员不应该依赖控制台。要确定您的程序正在打印什么,请将输出重定向到文件并使用十六进制查看器查看结果。
首先,您不需要使用 printf。转义序列
\u
由 C 编译器解释(而不是标准库,在调用 时printf
),就像序列一样\n
。如果你 print 也是一样的puts(" \u0305")
。现在,当我们编写代码时,
\u0305
我们告诉 C 编译器:在这个字符串中分配一个字节作为前导空格,然后是 Unicode 代码点编号 0x 0305(十六进制)。这如何存储在字符串中(在编译时,从源代码转换为可执行或二进制对象时),取决于locale
系统的设置 ( )。如果您使用 UTF-8,它将是 - 在这种情况下 - 两个字节。在打印时(到控制台或文件),这些字节将按原样输出。为了让您的眼睛将其视为 Unicode 所声称的字符,控制台或文件查看器必须与编译器一致。
总的来说,必须满足几个条件:
\u
(几乎所有序列都会发生这种情况)我猜你的情况是:
您的编译器正在使用 UTF-8 。字符号 0305 被编码为字节序列
0xCC
0x85
您的控制台没有使用 UTF.8,而是使用扩展的 ASCII 模式(每个字符一个字节) - 以及一种相当老式的模式CP437,即DOS中使用的模式。如果您在表中查找(两个!)字符 0xCC 和 0x85,您会发现它们与您所看到的相对应。
所以,你应该做的是设置你的控制台/终端,以便在将字节解释为文本时(每个控制台都会这样做,我们不时意识到这一点很重要)它使用 UTF-8。
更一般地说,程序员不应该依赖控制台。要确定您的程序正在打印什么,请将输出重定向到文件并使用十六进制查看器查看结果。