我希望我的C程序从printf()输出≥和≤符号,而不是用?替换它们。有可能这样做吗?
答案 0 :(得分:7)
简答:是的,可以使用printf()
输出≤和≥等符号。
我刚刚编译并运行了这个程序:
#include <stdio.h>
int main()
{
printf("≤ ≥ \n");
printf("\342\211\244 \342\211\245 \n");
}
当我运行它时,会打印两行
≤ ≥
这正是我所期待的。
现在,添加我在Mac上编译并运行它是非常重要的。我可以打开一个终端偏好设置对话框,其中一个是&#34;高级&#34;我得到的设置是&#34;字符编码&#34;,我通常设置为&#34; Unicode(UTF-8)&#34;。这是一个不错的选择。但如果我暂时将其更改为&#34; Western(ISO Latin 1)&#34;,程序将打印
⤠â¥
相反,如果您知道这些编码是如何工作的,这并不奇怪,但显然不是预期的。
如果我要在我的一台Linux机器上运行这个程序,我希望它的工作方式一样。在那些机器上,如果我想切换到默认UTF-8以外的编码,我可能会使用一些类似的终端属性对话框,但我不记得它在哪里或如何工作,我希望不同版本的Linux之间可能存在很大差异。
我认为在Windows机器上有类似的设置需要担心,但我不能使用Windows,所以我不确定细节,我也不确定UTF-8是默认的可能性。
我应该指出,我在这里发布的代码只是一个实验,看看您的终端窗口或其他输出系统是否可以(或可以制作)支持UTF-8输出。这不一定是扩展字符输出的最佳或最便携的方式。
具体来说,我的第一行,
printf("≤ ≥ \n");
是糟糕的形式,因为它不一定能保证你可以直接在普通的字符串文字中使用Unicode字符,而我的第二行,
printf("\342\211\244 \342\211\245 \n");
很差,因为它假定 UTF-8。 (理论上,您的输出子系统可能使用比UTF-8更宽的ASCII表示。但它不太可能;到目前为止,UTF-8几乎到处都是。)
更好(更便携)还包括<wchar.h>
和使用wprintf
以及宽字符串常量(如Nominal Animal&#39;答案所示):
wprintf(L"Here are ≤ and ≥ \n");
最好在使用这些时明确设置语言环境;有关详细信息,请参阅Nominal Animal的答案。
还有&#34;通用&#34;字符常量,如Jonathan Leffler的评论中所述:
printf("\u2264 \u2265 \n");
(这最后应该也可以使用L
修饰符和wprintf
;我不确定。)
附录:打印Unicode字符的另一种方法是使用wctomb()
将它们单独转换为多字节(通常是UTF-8)序列:
char le[MB_LEN_MAX+1];
char ge[MB_LEN_MAX+1];
int r = wctomb(le, 0x2264); /* U+2264: <= */
le[r] = '\0';
r = wctomb(ge, 0x2265); /* U+2264: >= */
ge[r] = '\0';
printf("%s %s\n", le, ge);
答案 1 :(得分:3)
如果您希望代码可移植,请使用宽字符输出。以下代码是标准C(C99或更高版本):
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <stdio.h>
int main(void)
{
if (!setlocale(LC_ALL, ""))
fprintf(stderr, "Warning: Current locale is not supported by the C library.\n");
if (fwide(stdin, 1) < 1)
fprintf(stderr, "Warning: Standard input does not support wide characters.\n");
if (fwide(stdout, 1) < 1)
fprintf(stderr, "Warning: Standard output does not support wide characters.\n");
wprintf(L"Here are ≤ and ≥.\n");
return EXIT_SUCCESS;
}
在Linux系统上(我也相信在Mac上),如果你有一个可以显示≤和≥的语言环境,那就是你会得到的。在其他区域设置中,您会看到Here are <= and >=.
。
如果您需要能够使用窄标准输入和输出功能(例如,因为您使用其他代码),请使用
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <stdio.h>
int main(void)
{
if (!setlocale(LC_ALL, ""))
fprintf(stderr, "Warning: Current locale is not supported by the C library.\n");
printf("Here are %lc and %lc.\n", L'≤', L'≥');
return EXIT_SUCCESS;
}
代替。不幸的是,这往往会出现无法支持≤和≥字符的区域设置问题(在我的系统上,输出只有Here are
而没有换行符)。我个人会改用第一种方法。