2012-06-26 55 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""作爲替換,但最後我決定使用空格字符,因爲它看起來更乾淨。

相關問題