【问题标题】:How to Print Box Characters in C (Windows)如何在 C (Windows) 中打印方框字符
【发布时间】:2018-01-13 23:11:24
【问题描述】:

如何在 C 中打印一个破折号?

其中之一:—

每当我这样做时:printf("—") 我只会在终端中得到一个 ù

谢谢。

编辑:下面的代码应该打印出一个 Xs 和 Os 外观的网格,水平线用短划线表示。

int main ()
{
    char grid[3][3] = {{'a', 'a', 'a'}, {'a', 'a', 'a'}, {'a', 'a', 'a'}};

    int i, j;

    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            if (j != 0)
            {
                printf("|");
            }
            printf("  %c  ", grid[i][j]);
        }
        if (i != 2)
        {
            printf("\n——————————————\n");
        }
    }

    return 0;
}

输出:(“ù”应该是“—”)

  a  |  a  |  a
ùùùùùùùùùùùù
  a  |  a  |  a
ùùùùùùùùùùùù
  a  |  a  |  a

编辑:我在 Windows 10 x64 上使用 Codeblocks 16.01 和 C11。

编辑:我被告知盒子字符,问题已经演变成如何打印这些字符,因此标​​题和标签发生了变化。

【问题讨论】:

  • em dash 不是 ASCII 的一部分,只有当您的编译器符合 C95 标准时,您才能使用 wchar。你的终端和操作系统也应该支持它。
  • 在 UTF8 语言环境的 Linux 上工作。
  • 良好的传统 id 以 unicode 数字编写源代码。非 ASCII 源可能会出现后期错误
  • 如果您要使用非 ascii 字符来绘制这些行,不妨使用box drawing characters。然后至少它看起来像线条在一起。

标签: c windows unicode special-characters


【解决方案1】:

在标准 C 中,您使用宽字符和宽字符串:

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

int main(void)
{
    setlocale(LC_ALL, "");
    fwide(stdout, 1);

    wprintf(L"??????? ?????\n");

    wprintf(L"   │   │   \n");
    wprintf(L"───┼───┼───\n");
    wprintf(L"   │   │   \n");
    wprintf(L"───┼───┼───\n");
    wprintf(L"   │   │   \n");

    return EXIT_SUCCESS;
}

您可以使用宽字符常量,例如L'┼'printf()wprintf() 函数的转换说明符是 %lc。同样,宽字符串常量有一个L 前缀,其转换说明符是%ls

很遗憾,您仅限于使用 Microsoft 提供的 C 的错误版本,因此它可能适合您,也可能不适合您。


以上代码在 Windows 中不起作用,因为 Microsoft 不希望它这样做。有关详细信息,请参阅setlocale() 上的 Microsoft 文档:

可用的语言环境名称、语言、国家/地区代码和代码页集包括 Windows NLS API 支持的所有内容,但每个字符需要两个以上字节的代码页除外,例如 UTF-7 和 UTF-8 .

换句话说,Microsoft 的 C 本地化仅限于一字节代​​码页,并且明确排除了任何 Unicode 语言环境。然而,这纯粹是 Microsoft 的 EEE 策略的一部分,旨在将您这个崭露头角的开发人员绑定到 Microsoft 自己的围墙花园,这样您就不会编写实际的可移植 C 代码(或者,恐怖的恐怖,利用 POSIX C) ,但在精神上被微软模式锁定。你看,你可以使用_setmode()来启用Unicode输出。

由于我自己根本不使用 Windows,因此我无法验证以下特定于 Windows 的解决方法是否真的有效,但值得一试。 (请在评论中报告您的发现,Windows 用户,所以我可以修复/包含此答案的这一部分。)

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

#ifdef _WIN32
#include <io.h>
#include <fcntl.h>

static int set_wide_stream(FILE *stream)
{
    return _setmode(_fileno(stream), _O_U16TEXT);
}

#else

static int set_wide_stream(FILE *stream)
{
    return fwide(stream, 1);
}

#endif

int main(void)
{
    setlocale(LC_ALL, "");

    /* After this call, you must use wprintf(),
       fwprintf(), fputws(), putwc(), fputwc()
       -- i.e. only wide print/scan functions
       with this stream.
       You can print a narrow string using e.g.
       wprintf(L"%s\n", "Hello, world!");
    */
    set_wide_stream(stdout, 1);

    /* These may not work in Windows, because
       the code points are 0x1F785 .. 0x1F7AE
       and Windows is probably limited to
       Unicode 0x0000 .. 0xFFFF */
    wprintf(L"??????? ?????\n");

    /* These are from the Box Drawing Unicode block,
       U+2500 ─, U+2502 │, and U+253C ┼,
       and should work everywhere. */
    wprintf(L"   │   │   \n");
    wprintf(L"───┼───┼───\n");
    wprintf(L"   │   │   \n");
    wprintf(L"───┼───┼───\n");
    wprintf(L"   │   │   \n");

    return EXIT_SUCCESS;
}

【讨论】:

  • 不幸的是,我无法让这些方框字符正常工作。他们只是变成了-,¦和+。这只是Windows的事情吗?是否可以在 Windows 上正确显示框字符?此外,那些 ??????? ????? 字符也不起作用。他们只是在命令提示符下什么都不输出。而且,当您说“微软提供的 C 的错误版本”时,这到底是什么意思?谢谢你,很抱歉有这么多问题。
  • @Halp:我的意思正是你发现的。它可以在其他操作系统上运行,您会看到:Microsoft 是希望它无法运行的操作系统。这可能发生在用户区域设置使用的字符集没有这些字符的任何系统上。只是因为 Windows 确实 支持 C 代码中的 Unicode(或任何其他多字节字符集)语言环境,因此无论您的语言环境如何,它都会在 Windows 中发生。 2017 年的大多数用户(跨操作系统)都使用 Unicode 语言环境。你能试试我的盲编码 Windows 扩展示例吗?
  • 我编译了代码,在第 12 行:error: '_O_U16TEXT' undeclared (first use in this function)| 和第 35 行:error: too many arguments to function 'set_wide_stream'| 出现错误。最后一个错误很容易解决,我刚刚摆脱了第二个参数。对于最后一个错误,我可以通过谷歌搜索并找到关于 C++ 的类似问题来修复它,但它似乎也适用于 C:stackoverflow.com/questions/10882277/… 我刚刚做了:#define _O_U16TEXT 0x20000。 PT1
  • @Halp:这取决于你想用你的编程技能做什么。如果您打算从事高性能计算、定制服务器软件或嵌入式设备的工作,那么学习 POSIX C 非常有意义。如果您打算在 Windows 应用程序上工作,那么您从 POSIX 中一无所获。如果您想用 C 编写可移植的 GUI 应用程序,请查看 GTK+。我个人不喜欢将我的技能锁定在一个反复无常的公司所有者的商业产品上,所以对我来说,答案很简单:一直 POSIX。
  • @Halp:我在 1998 年安装了我的第一台 Linux 服务器,有很多用户,并在 2003-2005 年完全切换到 Linux(不记得确切的年份了),在台式机和笔记本电脑上。我在只运行过 Linux 的 HP EliteBook 820 上写这篇文章。除了游戏,老实说,我真的看不出 Linux 中可能缺少哪些应用程序。虽然您可能希望使用 Microsoft Office、Adobe Photoshop 和 Adob​​e Illustrator 等商业应用程序,但我发现 LibreOffice、Gimp 和 Inkscape 可以满足我的需求;另外,如果我愿意/需要,我可以扩展它们。
猜你喜欢
  • 2021-12-26
  • 2012-01-03
  • 2017-01-19
  • 2012-01-09
  • 2012-10-14
相关资源
最近更新 更多