C编程,Unicode和Linux终端

3

我想要做的是使用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

我也希望这个可以工作,因为我计划拥有数据结构来保存这些字符的字符串。




谢谢!


这个问题是否更好地表达为“如何配置我的终端以显示Unicode?”如果是,那么它可能属于SuperUser。无论如何,请不要在该网站上再次发布它。它将由高声望用户联盟在此处处理或迁移。 - dmckee --- ex-moderator kitten
@dmckee 在任何正常的Linux发行版上,都可以显示Unicode。这是一个编程问题。 - Justin Smith
2个回答

10

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

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

L'\x3074'

同时 %c 输出一个 char,但对于 wchar_t,需要使用 %lc.


5

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

  • 第一个问题已经被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的字体)


setlocale调用解决了我的问题。 - dan gibson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接