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_encoding
que 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");
Consulte "[Stack Overflow no permite etiquetas en títulos] (http://meta.stackexchange.com/a/130208)". –
@JohnSaunders Gracias, recordaremos que –
Tal vez necesite ['EncoderFallback'] (http://msdn.microsoft.com/en-us/library/system.text.encoding.encoderfallback.aspx)? – Vlad