2016-01-22 59 views
0

我想打印在C这个中等色调统一盒unicode的盒子:▒打印用C

(我做的练习以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?

而且好像我还是要设置locale(即使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; 
} 

我明显错过了一些东西,但无法弄清楚它是什么。

+0

我应该注意到,我正在使用以下编译器命令:'cc --std = c11' – RandomUser762

+0

可能会有帮助:http://stackoverflow.com/q/12017342/2476755 – royhowie

+0

在Mac OSX上, t需要'wchar.h','wprintf'或'L'前缀或'setlocale'。如果你想打印一个盒子,只需打印一个盒子:'printf(“▒\ n”);' – user3386109

回答

3

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

您可以打印这个东西使用宽字符的API:只需直接打印UTF-8编码

#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; 
} 

或者:

#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

Mac'Terminal.app'支持Unicode就好了;您甚至可以选择通过不同配置文件使用的编码。 – nneonneo

+0

@nneonneo:是的,但过去不太完整,我使用'iTerm2'的原因不同:它允许更多控制重新映射修改键,我使用了很多,尤其是在本地编辑和使用我自己的远程编辑时版本的emacs';-)' – chqrlie

+0

Ohhhhh我明白了!谢谢! utf-8“encoding”是一个最多4个字节的字符串,而不是一个1到4个字节的值。 – RandomUser762

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相同的输出。