2012-06-26 2 views
8

Я пишу программу, в которой часть отображает растровый шрифт в CP437.Проверьте, существует ли символ в кодировке

В функции, которая делает текст с я хочу, чтобы иметь возможность проверить, является ли char доступен в CP437 до преобразования кодирования, как:

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

Без проверки, любые символы за пределами CP437 приведут в '?' (63, 0x3F). Я хочу полностью скрыть любые недопустимые символы. Есть ли реализация char_exist_in_encoding, кроме следующего глупого подхода?

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


Возможно, не очень актуальна, но растровое изображение создается так:

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

См. «[Переполнение стека не допускает теги в заголовках] (http://meta.stackexchange.com/a/130208)». –

+0

@JohnSaunders Спасибо, запомните, что –

+1

Возможно, вам нужно ['EncoderFallback'] (http://msdn.microsoft.com/en-us/library/system.text.encoding.encoderfallback.aspx)? – Vlad

ответ

2

Благодаря Владу, после того, как немного исследования EncoderFallback я наконец-то увидел an example in MSDN

Мой рабочий (возможно, временный рабочий) код:

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

Он заменяет неверные символы пробелом " ".

P.S. Первоначально я использовал пустой string"" в качестве замены, но, наконец, решил использовать символ пробела, потому что он выглядит чище.

Смежные вопросы