Печать символов штриховой графики ASCII в консольном приложении C # - PullRequest
15 голосов
/ 22 декабря 2010

Я бы хотел, чтобы консольное приложение C # печатало расширенные коды ASCII из http://www.asciitable.com/. В частности, я смотрю на символы штриховой графики: 169, 170, 179-218. К сожалению, когда я попытался, я получил 'Ú' за 218 и ожидал увидеть других персонажей из http://www.csharp411.com/ascii-table/.

Мне известно, что в ASCII указываются только коды символов 0 - 127. Я нашел другой пост со ссылкой на SetConsoleOutputCP (), но не смог заставить его работать в классе C # или найти пример того, как это сделать. поэтому.

Можно ли печатать символы штриховой графики в консольном приложении C #? Если это так, может кто-нибудь предоставить URL к примеру или коду?

Ответы [ 5 ]

21 голосов
/ 22 декабря 2010

Небольшая программа, которая изменяет кодовую страницу, используемую свойством 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-эквиваленты коробки .Есть несколько дополнительных символов, которые могут быть вам полезны.На этой странице Википедии перечислены все их кодовые точки.

Я собрал это, чтобы опробовать их:

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();
        }
    }
}

Для меня довольно много символов просто выглядят как ?, но стандартные глифы box-art, которые мы привыкли видеть в старых играх ASCII, действительно появляются для меня.Надеюсь, это сработает для вас.

2 голосов
/ 12 июля 2013

Вы можете просто использовать Знаки из ASCII-таблицы в Windows.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("╔═╗");
        Console.WriteLine("╚═╝");
    }
}
1 голос
/ 20 июля 2017

Для просмотра правильных ascii на консоли я просто делаю это:

Console.OutputEncoding = System.Text.Encoding.GetEncoding(28591);

Чтобы понять ASCII Chart, я написал следующий код:

using System;

namespace AsciiChart
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.GetEncoding(28591);
            for (int i = 0; i < 256; i++) {
               Console.Write(i+"=> ["+(char)i +"]  \n");
            }
            Console.ReadKey();
        }
    }
}

enter image description here

Давайте начнем рисовать, образец 1:

using System;

namespace AsciiBorder
{
    class Program
    {
        static void Main(string[] args)
        {
            int topleft = 218;
            int hline = 196;
            int topright = 191;
            int vline = 179;
            int bottomleft = 192;
            int bottomright = 217;

            Console.OutputEncoding = System.Text.Encoding.GetEncoding(28591);
            //draw top left corner
            Write(topleft);
            //draw top horizontal line
            for (int i = 0; i < 10; i++)
                Write(hline);
            //draw top right corner
            Write(topright);
            Console.WriteLine();
            //draw left and right vertical lines
            for (int i = 0; i < 6; i++)
            {
                Write(vline);
                for (int k = 0; k < 10; k++) {
                    Console.Write(" ");
                }
                WriteLine(vline);
            }
            //draw bottom left coner
            Write(bottomleft);
            //draw bottom horizontal line
            for (int i = 0; i < 10; i++)
                Write(hline);
            //draw bottom right coner
            Write(bottomright);
            Console.ReadKey();
        }
        static void Write(int charcode)
        {
            Console.Write((char)charcode);
        }
        static void WriteLine(int charcode)
        {
            Console.WriteLine((char)charcode);
        }
    }
}

Консольный вывод:

enter image description here

Подробнее о Латинские 1 и кодовые страницы ASCII

Завершено 3x3 Tic-Tac-Toe, как чертежный код для доски: образец 2

enter image description here

Код:

using System;

namespace AsciiBorder
{
    class Program
    {
        const int topleft = 218, hline = 196, topright = 191, vline = 179, bottomleft = 192, bottomright = 217, cross = 197, topT = 194, bottomT = 193, leftT = 195, rightT = 180;
        const int space = 10/*this determine size of the single cell*/, spacer_ex = (space / 2) + 1;
        static void Main(string[] args)
        {            
            Console.OutputEncoding = System.Text.Encoding.GetEncoding(28591);
            Console.Title = "3x3 Board";
            DrawTop();
            DrawMidSpacer();
            DrawMiddle();
            DrawMidSpacer();
            DrawMiddle();
            DrawMidSpacer();
            DrawBottom();

            Console.ReadKey();
        }
        static void DrawBottom() {
            #region bottom
            Write(bottomleft);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(bottomT);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(bottomT);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(bottomright);

            Console.WriteLine();
            #endregion
        }
        static void DrawMiddle() {
            #region middle
            Write(leftT);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(cross);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(cross);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(rightT);

            Console.WriteLine();
            #endregion
        }
        static void DrawMidSpacer() {
            #region middlespacer
            for (int x = 0; x < spacer_ex; x++)
            {
                Write(vline);
                for (int i = 0; i < space; i++)
                    Console.Write(" ");
                Write(vline);
                for (int i = 0; i < space; i++)
                    Console.Write(" ");
                Write(vline);
                for (int i = 0; i < space; i++)
                    Console.Write(" ");
                Write(vline);

                Console.WriteLine();
            }
            #endregion
        }
        static void DrawTop() {
            #region top
            Write(topleft);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(topT);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(topT);
            for (int i = 0; i < space; i++)
                Write(hline);
            Write(topright);

            Console.WriteLine();
            #endregion
        }
        static void Write(int charcode)
        {
            Console.Write((char)charcode);
        }
        static void WriteLine(int charcode)
        {
            Console.WriteLine((char)charcode);
        }
    }
}
1 голос
/ 22 декабря 2010

Я боролся с этим несколько дней назад. Я не думаю, что это может быть сделано, независимо от того, что говорят другие люди. Теперь я пытался создать игру в стиле Dwarf Fortress. Если вы делаете то же самое, делайте то, что он сделал. Используйте изображения.

  • Быстрее, потому что он может использовать графическое ускорение.
  • Проще, потому что это плитки и Есть много учебников по выполнению что.
  • Хорошо поддерживается, с такими вещами, как XNA для самой основы вы уже использую.
  • Расширяемый, так что вы можете поменять в другом изображения на более поздний срок, для новых такие изображения, как бородатые улыбки в DF.
0 голосов
/ 22 декабря 2010

Я не знаю, как заставить работать ASCII, но вы можете использовать Unicode, до некоторой степени, если хотите.Требуется, чтобы на консоли был установлен шрифт истинного типа.

Статья Майкла Каплана «Любой, кто говорит, что консоль не может делать Unicode, не настолько умён, как они думают», включает в себя код для этого.

Я не мог заставить его код работать напрямую, но это работало для меня, пока я запускал его из True Type Font Console.В статье рассказывается, как его установить.

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);
}
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...