在C#控制台应用程序中打印ASCII线条艺术字符

时间:2010-12-22 16:09:04

标签: c#

我想让C#控制台应用程序从http://www.asciitable.com/打印扩展的ASCII代码。特别是我正在看线条艺术角色:169,170,179-218。不幸的是,当我尝试时,我最终获得了218的“Ú”并希望看到来自http://www.csharp411.com/ascii-table/的其他角色。

我知道ASCII只指定字符代码0 - 127.我发现另一篇文章引用了SetConsoleOutputCP(),但是无法在C#类中使用它或找到如何做的示例如此。

是否可以在C#控制台应用程序中打印艺术字符?如果是,有人可以提供示例或代码的URL吗?

4 个答案:

答案 0 :(得分:21)

一个小程序,它修改Console.OutputEncoding属性使用的代码页以使用您想要的字符:

class Program
{
    static void Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.GetEncoding(1252);
        Console.WriteLine((char) 169);
        Console.WriteLine((char) 170);

        for(char c = (char)179; c <= (char)218; ++c)
        {
            Console.WriteLine(c);
        }
    }
}

修改

所以我继续前进,抬头看Unicode equivalents of the box art。还有一些额外的字形可能对您有用。维基百科页面列出了他们所有的代码点。

我把它拼凑起来试试看:

class Program
{
    static void Main(string[] args)
    {
        for(int i = 0x2500; i <= 0x2570; i += 0x10)
        {
            for(int c = 0; c <= 0xF; ++c)
            {
                Console.Write((char) (i + c));
            }

            Console.WriteLine();
        }
    }
}

对我来说,很多字形只是?,但我们习惯在旧的ASCII游戏中看到的标准的艺术字形对我来说确实很有用。希望这些对你有用。

答案 1 :(得分:2)

您可以在Windows中使用ASCII表中的符号。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("╔═╗");
        Console.WriteLine("╚═╝");
    }
}

答案 2 :(得分:1)

我争吵了好几天。不管其他人说什么,我认为不可能做到。现在,我正试图制作一个矮人堡垒风格的游戏。如果你也这样做,那就做他做的。使用图片。

  • 更快,因为它可以利用 图形加速。
  • 更容易,因为它们是瓷砖和 有很多关于做的教程 这一点。
  • 支持得很好,像XNA这样的东西 对于你的框架 已经在使用。
  • 可扩展,所以你可以互换其他 以后的图像,换新的 像DF中留着胡须的笑容。

答案 3 :(得分:0)

我不知道如何让ASCII工作,但如果你愿意,你可以在某种程度上使用Unicode。它确实需要将控制台设置为真正的字体。

迈克尔卡普兰的article'任何人说控制台不能做Unicode并不像他们认为的那样聪明'包含了这个代码。

我无法让他的代码直接工作,但只要我从True Type字体控制台运行它,这对我有用。该文章包括如何设置它。

using System;
using System.Runtime.InteropServices;
namespace TestUnicode

{
    class Program
{



public static void Main(string[] args) {
    string st = "\u0169\u0129\n\n";
    IntPtr stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    uint written;
    WriteConsoleW(stdout, st, st.Length, out written, IntPtr.Zero);
}


[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
internal static extern bool WriteConsoleW(IntPtr hConsoleOutput,
                                          string lpBuffer,
                                          int nNumberOfCharsToWrite,
                                          out uint lpNumberOfCharsWritten,
                                          IntPtr lpReserved);


internal static bool IsConsoleFontTrueType(IntPtr std) {
 CONSOLE_FONT_INFO_EX cfie = new CONSOLE_FONT_INFO_EX();
    cfie.cbSize = (uint)Marshal.SizeOf(cfie);
    if(GetCurrentConsoleFont(std, false, ref cfie)) {
        return(((cfie.FontFamily & TMPF_TRUETYPE) == TMPF_TRUETYPE));
    }
    return false;
}



[DllImport("Kernel32.DLL", ExactSpelling = true)]
internal static extern IntPtr GetStdHandle(int nStdHandle);


[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool GetCurrentConsoleFont(IntPtr hConsoleOutput,
                                                    bool bMaximumWindow, 
                                                    ref CONSOLE_FONT_INFO_EX lpConsoleCurrentFontEx);



internal struct COORD {
    internal short X;
    internal short Y;
    internal COORD(short x, short y) {
        X = x;
        Y = y;
    }
}

[StructLayout(LayoutKind.Sequential)]
internal unsafe struct CONSOLE_FONT_INFO_EX {
    internal uint cbSize;
    internal uint nFont;
    internal COORD dwFontSize;
    internal int FontFamily;
    internal int FontWeight;
    fixed char FaceName[LF_FACESIZE];
}

internal const int TMPF_TRUETYPE = 0x4;
internal const int LF_FACESIZE = 32;
internal const string BOM = "\uFEFF";
internal const int STD_OUTPUT_HANDLE = -11; // Handle to the standard output device.
internal const int ERROR_INVALID_HANDLE = 6;
internal const int ERROR_SUCCESS = 0;
internal const uint FILE_TYPE_UNKNOWN = 0x0000;
internal const uint FILE_TYPE_DISK = 0x0001;
internal const uint FILE_TYPE_CHAR = 0x0002;
internal const uint FILE_TYPE_PIPE = 0x0003;
internal const uint FILE_TYPE_REMOTE = 0x8000;
internal static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
}
    }