如何在输出中输出C和≤符号而不是?

时间:2018-05-14 02:07:58

标签: c

我希望我的C程序从printf()输出≥和≤符号,而不是用?替换它们。有可能这样做吗?

2 个答案:

答案 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而没有换行符)。我个人会改用第一种方法。