Печать символов в ASCII-строке в приложении консоли С#

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

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

Можно ли печатать символы линии в приложении консоли С#? Если это возможно, кто-то может указать URL-адрес примера или кода?

Ответы

Ответ 1

Небольшая программа, которая изменяет кодовую страницу, используемую свойством 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);
        }
    }
}

EDIT:

Итак, я пошел вперед и посмотрел 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();
        }
    }
}

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Я не знаю, как заставить ASCII работать, но вы можете использовать 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);
}
    }

Ответ 5

Чтобы посмотреть правильный ascii на консоли, я просто делаю это:

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

Чтобы понять ASCII-диаграмму, я написал ниже код:

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

введите описание изображения здесь

Давайте начнем рисовать, образец 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);
        }
    }
}

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

введите описание изображения здесь

Дополнительная информация о латинские 1 и кодовые страницы ASCII

Завершено 3x3 Tic-Tac-Toe, например, код рисования: Пример 2

введите описание изображения здесь

Код:

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