检查编码中是否存在字符
我正在编写一个程序,部件在CP437中呈现位图字体。
在一个呈现文本的函数中,我希望能够在编码转换之前检查CP437中是否有char
,如:
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");
感谢Vlad,经过对EncoderFallback
的一些研究后,我终于在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]); }
它将无效字符替换为空格" "
。
PS我最初使用空string
""
作为替换,但最后我决定使用空格字符,因为它看起来更干净。