用printf打印出unicode字符

Mik*_*ike 6 c unicode printf

我试图?通过将相应的十进制值传递给printf 来打印出来.输出什么都没有.为什么我的代码不起作用?

#include <stdio.h>
int main()
{
    printf("%lc",536);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 6

在Mac OS塞拉利昂10.12.2与GCC 6.3.0,如果我运行这个程序(编译自mb37.cmb37):

#include <locale.h>
#include <stdio.h>
#include <wchar.h>      /* wint_t */

int main(void)
{
    setlocale(LC_ALL, "");
    printf("%lc\n", (wint_t)536);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

$ ./mb37
?
$
Run Code Online (Sandbox Code Playgroud)

我相信,这是所需的输出。如果setlocale()删除该行,则根本不会产生任何输出——甚至不会产生换行符。使用的语言环境是en_US.UTF-8;我的终端也处理 UTF-8。语言环境名称是通过捕获并打印来自setlocale()- 常规字符串的返回值来找到的。

所述wint_t铸造是半可选的; 碰巧的是,没有强制转换或<wchar.h>标头的 64 位编译也会产生相同的输出,但有一个轻微的巧合wint_tint. 这需要一些跟踪;wint_t定义为__darwin_wint_t定义为__darwin_ct_rune_t定义为int。为了便于移植,演员阵容是必要的。在某些系统上,可能没有必要(而 macOS Sierra 就是这样一种系统)。

中的换行符printf()不是 100% 必要的,但如果它被省略,下一个提示会紧跟在 U+0218 LATIN CAPITAL LETTER S WITH COMMA BELOW 之后。最好确保输出以换行符结尾。


gna*_*729 -1

C 中不要求打印末尾没有换行符的行。尝试“%lc\n”。

  • 我认为你错了,@gnasher729。如果“stdout”是行缓冲(默认)或完全缓冲,那么输出可能不会*立即*出现,但它会在文件刷新时出现,这发生在关闭文件时,发生在程序调用“ exit()` 函数或从 `main()` 返回,正如 OP 的程序确实所做的那样。 (2认同)