Печать символов в 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);
}
}
}