我正在尝试用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;
}
我显然遗漏了一些东西但却无法弄清楚它是什么。
答案 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
相同的输出。