C编程,unicode和linux终端

时间:2010-02-09 17:52:46

标签: c linux command-line unicode

所以我要做的就是在我的终端上写日文字符 屏幕使用C和宽字符。

问题是我正在做什么,所以我可以解决它, 在使用宽字符时,我应该注意什么其他警告 你对我正在做什么有任何其他意见吗?




糟糕的代码:

#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

所以我也想做这项工作,因为我计划拥有数据结构 拿着这些字符的字符串。




谢谢!

2 个答案:

答案 0 :(得分:10)

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

如果您需要wchar_t,请使用单引号:

L'\x3074'

同样%c打印char,但对于wchar_t,您需要%lc

答案 1 :(得分:4)

代码中至少存在两个问题。

  • Kenny指出第一个,格式与参数
  • 不匹配
  • 第二个是你错过了对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的字体)