2012-06-26 20 views
8

Estoy escribiendo un programa que una parte representa una fuente de mapa de bits en CP437.Compruebe si el carácter existe en la codificación

En una función que hace que el texto con Quiero ser capaz de verificar si un char está disponible en CP437 antes de la conversión de codificación, como:

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

Sin el cheque, cualquier carácter fuera CP437 resultarán en un '?' (63, 0x3F). Quiero ocultar los caracteres inválidos por completo. ¿Hay una implementación de char_exist_in_encodingque no sea el siguiente enfoque estúpido?

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


Tal vez no sea muy relevante, pero el mapa de bits se crea de esta manera:

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

Consulte "[Stack Overflow no permite etiquetas en títulos] (http://meta.stackexchange.com/a/130208)". –

+0

@JohnSaunders Gracias, recordaremos que –

+1

Tal vez necesite ['EncoderFallback'] (http://msdn.microsoft.com/en-us/library/system.text.encoding.encoderfallback.aspx)? – Vlad

Respuesta

2

Gracias a Vlad, después de un poco de investigación en EncoderFallback que finalmente vio an example in MSDN

Mi código de trabajo (quizás de trabajo temporal) es:

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

Reemplaza los caracteres no válidos en un espacio " ".

P.S. Originalmente utilicé un string"" vacío como reemplazo, pero finalmente decidí usar el carácter de espacio porque se ve más limpio.