我不知道如何让ASCII工作,但如果你想要的话,可以使用Unicode到某种程度。这需要将控制台设置为真正的字体。
Michael Kaplan的文章“任何说控制台不能做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;
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);
}
}