Darstellungsfehler von Koreanischen und anderen ausländischen Zeichensätzen in C# / Visual Studio beheben

Ich weiß, der Titel des Posts ist grausam, aber ich wusste das Problem nicht kürzer zu beschreiben. Aber kommen wir nun zur Sache. Im Rahmen der Entwicklung meines Cloud Downloaders stieß ich unter anderem auf folgendes Problem. Koreanische Zeichen wurden nur als blanke Kästchen dargestellt, obwohl Sie im Quelltext korrekt angezeigt wurden. Wer sich jetzt fragt, wo man die koreanischen Zeichen auf einer deutschen Tastatur herbekommt, sollte einfach mal bei Google Translate vorbeischauen. (Der nachfolgende Screenshot veranschaulicht das Problem noch mal. Zum vergrößern bitte das Bild anklicken.)

Koreanische Zeichen falsche Darstellung

Im Netz habe ich nur sehr wenige Lösungen gefunden. Und fast alle waren meiner Meinung nach eher suboptimal. Meistens wird nämlich folgender Weg vorgeschlagen:

Es wird empfohlen die Methode SetCompatibleTextRenderingDefault() mit dem Parameter true aufzurufen. Hierdurch werden Texte mit der auf  GDI+ basierenden Graphics-Methode gerendert, welche zu Zeiten des .Net-Frameworks 1.x genutzt wurde.
Jedoch entstehen hierbei einige “Nachteile”. Zum einen werden die  Abstände bei der Graphics-Methode anders berechnet, sodass ein bestehendes Layout “auseinanderfallen” kann und zum anderen werden nicht alle Controls korrekt gerendert. (Ab .Net 2.0 wurde die auf GDI basierende TextRenderer Klasse eingeführt.)

Bezogen auf unsere Testapplikation sähe das wie folgt aus:

In der Program.cs aktivieren wir das DefaultTextRendering.

 static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(true);
            Application.Run(new Form1());
        }
    }
}

Und in der Applikation erhalten wir folgendes Ergebnis:
Koreanische Zeichen setcompatibletextrendering(true)
Wie man sieht, wird lediglich das Label korrekt dargestellt. Die Groupbox rendert die Zeichen weiterhin falsch.

Der andere Weg

Eine andere, und meiner Meinung nach eine bessere Lösung, ist der Weg über das Ändern der Schriftart/Font-Property. Es gibt ein paar Schriftarten, die wesentlich mehr Zeichensätze enthalten, als die ganzen Standardschriftarten. Eine davon ist zum Beispiel Arial Unicode MS, welche mit dem Microsoft Office mitgeliefert wird, aber auch auf MacOSX und auch einzeln verfügbar ist.
Setzt man nun diese Schriftart für alle seine Controls, erhält man folgendes Ergebnis:

namespace KoreanCharacters
{
    public partial class Form1 : Form
    {
        // [...]

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Font = new Font("Arial Unicode MS", 8.25f);
            foreach (Control con in GetAllControls(this))
                if (con.Font != null)
                    con.Font = new Font("Arial Unicode MS", 8.25f);

            this.Text = "안녕하세요";
            label1.Text = "안녕하세요";
            groupBox1.Text = "안녕하세요";
        }

        private static List<Control> GetAllControls(Control controlBase)
        {
            List<Control> controls = new List<Control>();
            foreach (Control con in controlBase.Controls)
            {
                controls.Add(con);
                List<Control> subControls = GetAllControls(con);
                controls.AddRange(subControls);
            }
            return controls;
        }
    }
}

03 koreanische zeichen arial unicode ms Darstellungsfehler von Koreanischen und anderen ausländischen Zeichensätzen in C# / Visual Studio beheben

Wie man sieht, wird nun auch der Text der Groupbox korrekt dargestellt. Sprich es werden sämtliche Controls, mit Ausnahme des Form-Text, korrekt dargestellt. Deshalb beschrieb ich diese Möglichkeit weiter oben auch nur als “bessere” und nicht als “perfekte” Lösung. Warum der Titel des Forms nicht korrekt gerendert wird, kann ich mir auch nicht erklären.

Ich hoffe ich konnte dem ein oder anderen von euch helfen. Standet ihr auch schon vor diesem Problem? Und wie habt ihr es gelöst? Kennt ihr vielleicht sogar eine bessere Lösung? Ich freue mich über jeden Kommentar!

Viele Grüße,
Raffi 

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.