2012-06-26 15 views
8

में वर्ण मौजूद है, मैं एक प्रोग्राम लिख रहा हूं कि एक भाग CP437 में बिटमैप फ़ॉन्ट प्रस्तुत करता है।जांचें कि क्या एन्कोडिंग

एक समारोह है कि पाठ renders के साथ मैं, जांच करने के लिए की तरह एन्कोडिंग रूपांतरण से पहले कि क्या एक 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; 
} 


शायद बहुत प्रासंगिक नहीं है, लेकिन बिटमैप इस तरह बनाई गई है: Vlad को

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

@ जॉन सैंडर्स धन्यवाद, याद होगा कि –

+1

शायद आपको ['एनकोडरफॉलबैक'] (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]); 
} 

यह अवैध वर्णों को " " पर स्थानांतरित करता है।

पीएस मैंने मूल रूप से प्रतिस्थापन के रूप में खाली string"" का उपयोग किया लेकिन आखिर में मैंने अंतरिक्ष चरित्र का उपयोग करने का निर्णय लिया, क्योंकि यह क्लीनर दिखता है।

संबंधित मुद्दे