打印wchar到Linux控制台?

我的C程序粘贴在下面。 在bash中,程序打印“char is”,Ω不打印。 我的语言环境都是en_US.utf8。

#include <stdio.h> #include <wchar.h> #include <stdlib.h> int main() { int r; wchar_t myChar1 = L'Ω'; r = wprintf(L"char is %c\n", myChar1); } 

Solutions Collecting From Web of "打印wchar到Linux控制台?"

这很有趣。 显然编译器会将UTF-8中的欧米茄翻译成UNICODE,但不知何故,libc会把它弄糟。

首先: %c格式说明符需要一个char (即使在wprintf -version中),所以你必须指定%lc (因此字符串是%ls )。

其次,如果你像这样运行你的代码,语言环境设置为C (它不会自动从环境中获取)。 你必须用一个空字符串来调用setlocale来从环境中获取locale,所以libc很快乐。

 #include <stdio.h> #include <wchar.h> #include <stdlib.h> #include <locale.h> int main() { int r; wchar_t myChar1 = L'Ω'; setlocale(LC_CTYPE, ""); r = wprintf(L"char is %lc (%x)\n", myChar1, myChar1); } 

除了建议修复LIBC的答案,您可以这样做:

 #include <stdio.h> #include <wchar.h> #include <stdlib.h> // NOTE: *NOT* thread safe, not re-entrant const char* unicode_to_utf8(wchar_t c) { static unsigned char b_static[5]; unsigned char* b = b_static; if (c<(1<<7))// 7 bit Unicode encoded as plain ascii { *b++ = (unsigned char)(c); } else if (c<(1<<11))// 11 bit Unicode encoded in 2 UTF-8 bytes { *b++ = (unsigned char)((c>>6)|0xC0); *b++ = (unsigned char)((c&0x3F)|0x80); } else if (c<(1<<16))// 16 bit Unicode encoded in 3 UTF-8 bytes { *b++ = (unsigned char)(((c>>12))|0xE0); *b++ = (unsigned char)(((c>>6)&0x3F)|0x80); *b++ = (unsigned char)((c&0x3F)|0x80); } else if (c<(1<<21))// 21 bit Unicode encoded in 4 UTF-8 bytes { *b++ = (unsigned char)(((c>>18))|0xF0); *b++ = (unsigned char)(((c>>12)&0x3F)|0x80); *b++ = (unsigned char)(((c>>6)&0x3F)|0x80); *b++ = (unsigned char)((c&0x3F)|0x80); } *b = '\0'; return b_static; } int main() { int r; wchar_t myChar1 = L'Ω'; r = printf("char is %s\n", unicode_to_utf8(myChar1)); return 0; } 

输出前使用{glib,libiconv,ICU}将其转换为UTF-8。