检查字符是否存在于编码中。

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
请参见“Stack Overflow不允许在标题中使用标签”。 - John Saunders
@JohnSaunders 谢谢,会记住的。 - Alvin Wong
1
也许你需要 EncoderFallback - Vlad
有没有一个在CP437之外的字符的例子?我尝试将0到254的每个字节都转换了一遍,它们似乎都可以正常工作。 - Michael Liu
@MichaelLiu 大多数Unicode字符,如中文,日文,韩文等。 - Alvin Wong
1个回答

2

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

它将无效字符替换为一个空格" "

P.S. 我最初使用空字符串""作为替换,但最终我决定使用空格字符,因为它看起来更清洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接