我的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 %cn",myChar1); }
dynamicreplace正在播放的gstreamerpipe道中的元素
fcntl:打开和closures磁盘缓冲
内存仍然可以修复的错误,但为什么?
在内存中安全地覆盖代码
CentOS 6.02 64位 *** 作系统中的OpenSSL构build错误
这很有趣。 显然编译器会将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 = ''; return b_static; } int main() { int r; wchar_t myChar1 = L'Ω'; r = printf("char is %sn",unicode_to_utf8(myChar1)); return 0; }
输出前使用{glib,libiconv,ICU}将其转换为UTF-8。
总结以上是内存溢出为你收集整理的打印wchar到Linux控制台?全部内容,希望文章能够帮你解决打印wchar到Linux控制台?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)