在C中打印unicode框

时间:2016-01-22 01:14:09

标签: c unicode utf-8

我正在尝试用C:▒

打印这个中等阴影的unicode盒子

(我正在K& R中进行练习,然后对制作直方图的那个进行了侧重...)。我知道我的unix术语(Mac OSX)可以显示该框,因为我用框保存了一个文本文件,并使用了cat textfilewithblock并打印了该块。

到目前为止,我最初尝试过:

#include <stdio.h>
#include <wchar.h>

int main(){
  wprintf(L"▒\n");
  return 0;
}

并且没有打印

iMac-2$ ./a.out 
iMac-2:clang vik$

我进行了搜索,发现了这个:unicode hello world for C?

似乎我仍然需要设置一个语言环境(即使在utf8中执行环境?我仍在试图找出为什么这一步是必要的)但是无论如何,它都有效! (经过一番斗争,终于意识到正确的字符串是en_US.UTF-8,而不是en_US.utf8我曾在某处读过......)

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(){
  setlocale (LC_ALL, "en_US.UTF-8");
  wprintf(L"▒\n");
  return 0;
}

输出如下:

iMac-2$ ./a.out 
▒
iMac-2$

但是,当我尝试下面的代码时...输入UTF-8十六进制(我从这里得到:http://www.utf8-chartable.de/unicode-utf8-table.pl?start=9472&unicodeinhtml=dec),这是盒子的0xe29692,而不是粘贴盒子本身,它没有'再次工作。

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(){
  setlocale (LC_ALL, "en_US.UTF-8");
  wchar_t box = 0xe29692;
  wprintf(L"%lc\n", box);
  return 0;
}

我显然遗漏了一些东西但却无法弄清楚它是什么。

2 个答案:

答案 0 :(得分:3)

MEDIUM SHADE代码点的unicode值不是0xe29692,而是0x2592<E2><96><92>是UTF-8中此代码点的3字节编码。

您可以使用宽字符API来打印此内容:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void) {
    setlocale(LC_ALL, "en_US.UTF-8");
    wchar_t box = 0x2592;
    wprintf(L"%lc\n", box);  // or simply printf("%lc\n", box);
    return 0;
}

或者直接打印UTF-8编码:

#include <stdio.h>

int main(void) {
    printf("\xE2\x96\x92\n");
    return 0;
}

或者,如果您的文本编辑器以UTF-8编码源文件:

#include <stdio.h>

int main(void) {
    printf("▒\n");
    return 0;
}

但请注意,这不起作用:putchar('▒');

另外,对于完整的unicode支持和更多好东西,我建议在MacOS上使用iTerm2

答案 1 :(得分:1)

框字符为U + 2592,在UTF-8中转换为0xE2 0x96 0x92。这个改编你的第三个程序主要适用于我:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
    setlocale (LC_ALL, "en_US.UTF-8");
    wchar_t box = 0xe29692;
    wprintf(L"%lc\n", box);
    wprintf(L"\n\nX\n\n");
    box = L'\u2592'; //0xE2 0x96 0x92 = U+2592
    wprintf(L"%lc\n", box);
    wprintf(L"\n\n0x%.8X\n\n", box);
    box = 0x2592;
    wprintf(L"%lc\n", box);
    return 0;
}

我得到的输出是:

X

▒


0x00002592

▒

第一次打印操作没有任何用处;其他人都在工作。

在Mac OS X 10.10.5上进行测试。我碰巧用GCC 5.3.0编译(我编译了),但我得到了与XCode 7.0.2和clang相同的输出。