Piszę program, w którym część renderuje czcionkę bitmapową w CP437.Sprawdź, czy znak istnieje w kodowaniu
W funkcji, która powoduje, że tekst z Chcę być w stanie sprawdzić, czy char
jest dostępny w CP 437 przed konwersji kodowania, jak:
public static void DrawCharacter(this Graphics g, char c)
{
if (char_exist_in_encoding(Encoding.GetEncoding(437), c) {
byte[] src = Encoding.Unicode.GetBytes(c.ToString());
byte[] dest = Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding(437), src);
DrawCharacter(g, dest[0]); // Call the void(this Graphics, byte) overload
}
}
Bez kontroli, żadnych znaków poza CP 437 spowoduje w '?'
(63, 0x3F). Chcę całkowicie ukryć wszystkie nieprawidłowe znaki. Czy jest implementacja char_exist_in_encoding
inna niż następujące głupie podejście?
private static bool char_exist_in_encoding(Encoding e, char c)
{
if (c == '?')
return true;
byte[] src = Encoding.Unicode.GetBytes(c.ToString());
byte[] dest = Encoding.Convert(Encoding.Unicode, e, src);
if (dest[0] == 0x3F)
return false;
return true;
}
Być może nie jest bardzo istotne, ale bitmapy jest tworzony tak:
Bitmap b = new Bitmap(256 * 8, 16);
Graphics g = Graphics.FromImage(b);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
Font f = new Font("Whatever 8x16 bitmap font", 16, GraphicsUnit.Pixel);
for (byte i = 0; i < 255; i++)
{
byte[] arr = Encoding.Convert(Encoding.GetEncoding(437), Encoding.Unicode, new byte[] { i });
char c = Encoding.Unicode.GetChars(arr)[0];
g.DrawString(c.ToString(), f, Brushes.Black, i * 8 - 3, 0); // Don't know why it needs a 3px offset
}
b.Save(@"D:\chars.png");
Zobacz "[Przekraczanie stosu nie pozwala na znaczniki w tytułach] (http://meta.stackexchange.com/a/130208)". –
@JohnSaunders Dzięki, pamiętam, że –
Może potrzebujesz ['EncoderFallback'] (http://msdn.microsoft.com/en-us/library/system.text.encoding.encoderfallback.aspx)? – Vlad