如何在用UTF8编码的C中打印unicode字符?

Nul*_*lik 4 c unicode ncurses utf-8

我正在尝试打印放大镜(http://www.fileformat.info/info/unicode/char/1f50e/index.htm),但出现此错误:

[niko@dev1 ncurses]$ gcc -o utf8 -std=c99 $(ncursesw5-config --cflags --libs) utf8.c 
utf8.c: In function ‘main’:
utf8.c:12:10: error: \ud83d is not a valid universal character
   printw("\ud83ddd0e\n");         // escaped Unicode 
          ^
[niko@dev1 ncurses]$ cat utf8.c
#include <locale.h>
#include <curses.h>
#include <stdlib.h>


int main (int argc, char *argv[])
{
  setlocale(LC_ALL, "");

  initscr();

  printw("\ud83ddd0e\n");         // escaped Unicode 

  getch();
  endwin();

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?例如,如果我有一个十进制编码,那么放大镜的编码是55357,如何在printf中将其打印到ncurses屏幕?(不使用wchar_t,因为它浪费很多内存)

Ant*_*ala 5

fileformat.info上的信息错误。页面上的转义符是\ud83d\udd0e。这是Java上使用的UTF-16代理对,但是在C上不起作用,因为GCC似乎要求一个\u转义符代表一个Unicode代码点,而代理转义符的一半则不然。

您应该改用\U(大写)8个十六进制数字,这样U + 1F50E变为\U0001F50E。使用正确输出此转义字符printf


PS:如果您没有看到放大镜,而是看到类似的~_~T~N,请确保已调用setlocale并实际上链接了-lncursesw,否则任何一个操作的失败将意味着将打印垃圾。