如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

时间:2013-01-21 00:20:27

标签: c linux unicode

我正在尝试显示(Box Drawing Range:2500-257F)中的Unicode字符。它应该是标准的utf8(Unicode标准,版本6.2)。我根本无法做到。

我首先尝试使用旧的ASCII字符,但Linux终端显示在utf8中,并且没有显示转换(符号?)。

任何人都可以回答这些问题:

  • 如何在C变量(style wchar_t)中编码unicode字符?
  • 如何对Unicode使用转义序列,如0x或0o(十六进制,八进制)?

我知道U +,但似乎没有用。

setlocale(LC_ALL,"");
short a = 0x2500, b = 0x2501;
wchar_t ac = a;
wchar_t bc = b;
wprintf(L"%c%c\n", ac, bc);
exit(0);

我知道结果与使用的字体有关,但我使用的是utf8字体(http://www.unicode.org/charts/fonts.html),必须显示2500到257F的代码...实际上他们不是。

提前感谢您的帮助......

2 个答案:

答案 0 :(得分:4)

使用包含这些字符的utf-8版本字节的Cstring。如果您打印该Cstring,它将打印该字符。

你的两个角色的例子:

#include <stdio.h>

int main (int argc, char *argv[])
{
    char block1[] = { 0xe2, 0x94, 0x80, '\0' };
    char block2[] = { 0xe2, 0x94, 0x81, '\0' };
    printf("%s%s\n", block1, block2);
    return 0;
}

为我打印─━

此外,如果您在其中的某处打印包含uft-8字符字节的Cstring,它将打印这些字符而不会出现问题。 / *假设您使用gcc * / 而且IIRC gcc在内部使用utf-8。

编辑:在我写这篇文章时,你的问题有所改变。而我的答案现在不那么重要了。 但是从你的症状 - 如果你看到一个?对于你期望的每个字符,我会说你的终端字体可能缺少这些字符所需的字形。

答案 1 :(得分:0)

这取决于你所谓的“终端”。

linux控制台使用各种黑客来显示unicode,但实际上它的字体仅限于512个符号IIRC,因此它无法真正显示整个unicode范围,它可以显示的内容取决于加载的字体(这可能会改变未来的)。

用于访问Linux的Windows终端通常会以某种方式单独使用。

物理终端通常更糟糕,只能在ascii-land中运行

Linux GUI终端(例如gnome-terminal)可以显示所有内容,只要你有相应的字体。

您确定不想使用ncurses而不是编写自己的终端小部件吗?