如何在C(Windows)中打印方框字符 [英] How to Print Box Characters in C (Windows)

查看:65
本文介绍了如何在C(Windows)中打印方框字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用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("
——————————————
");
        }
    }

    return 0;
}

输出:(""应为"-"s)

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

编辑:我在Windows 10 x64上使用代码块16.01和C11。

编辑:我被告知有方框字符,问题变成了如何打印这些字符,因此更改了标题和标签。

推荐答案

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

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

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

    wprintf(L"🞨🞩🞪🞫🞬🞭🞮 🞉🞈🞇🞆🞅
");

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

    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区域设置。然而,这纯粹是微软EEE战略的一部分,目的是将你这个初出茅庐的开发人员束缚在微软自己的围墙花园里,这样你就不会编写真正的可移植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
", "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"🞨🞩🞪🞫🞬🞭🞮 🞉🞈🞇🞆🞅
");

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

    return EXIT_SUCCESS;
}

这篇关于如何在C(Windows)中打印方框字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆