C编程,unicode和linuxterminal

所以我想要做的是用C和宽字符写日文字符到我的terminal屏幕上。

问题是我在做什么错了什么,以便我可以解决这个问题,在使用宽字符的时候我还有什么其他的需要注意的,你有什么其他的意见吗?

不好的代码:

#include <stdio.h> #include <wchar.h> int main( ) { wprintf(L"%c\n", L"\x3074"); } 

这不起作用,但我想知道为什么。

当我尝试使用wchar_t来保存一个值时,问题只会变得更糟:

 wchar_t pi_0 = 0x3074; // prints a "t" when used with wprintf wchar_t pi_1 = "\x3074"; // gives compile time warning wchar_t pi_2 = L"\x3074"; // gives compile time warning 

所以我也想做这个工作,因为我打算让数据结构保存这些字符的string。

谢谢!

"\x3074"的类型是const char[]L"\x3074"的类型是const wchar_t[]

如果你需要一个wchar_t ,使用单引号:

 L'\x3074' 

另外%c打印一个char ,但是对于wchar_t你需要一个%lc

代码中至少有两个问题。

  • 肯尼已经指出了第一个,格式与论点不符
  • 第二个是你错过了一个调用setlocale()

(还有一个假设,宽字符集是Unicode的 – 我似乎记得它始终是Linux的情况,但它不是通用的)。

在正确配置的终端中,

 #include <stdio.h> #include <wchar.h> #include <locale.h> int main( ) { setlocale(LC_ALL, ""); wprintf(L"%ls\n", L"\x0152\x3074"); return 0; } 

应该管用。 如果没有,我会开始检查setlocale()和wprint()的结果。

(我已经添加了U + 0152这是OE连字,以便我可以检查行为;我没有使用U + 3074字体)