2012-06-26 3 views
8

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_encodinginna 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"); 
+1

Zobacz "[Przekraczanie stosu nie pozwala na znaczniki w tytułach] (http://meta.stackexchange.com/a/130208)". –

+0

@JohnSaunders Dzięki, pamiętam, że –

+1

Może potrzebujesz ['EncoderFallback'] (http://msdn.microsoft.com/en-us/library/system.text.encoding.encoderfallback.aspx)? – Vlad

Odpowiedz

2

Dzięki Vlad, po badania nieco na EncoderFallback końcu zobaczyłem an example in MSDN

Mój działający (być może tymczasowo działający) kod to:

public static void DrawCharacter(this Graphics g, char c) 
{ 
    byte[] src = Encoding.Unicode.GetBytes(c.ToString()); 
    byte[] dest = Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding(437, new EncoderReplacementFallback(" "), new DecoderReplacementFallback(" ")), src); 
    DrawCharacter(g, dest[0]); 
} 

Zastępuje nieprawidłowe znaki na spacje " ".

P.S. Pierwotnie użyłem pustego string"" jako zamiennika, ale ostatecznie zdecydowałem się użyć znaku spacji, ponieważ wygląda on czystszy.