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.)
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:

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;
}
}
}
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
Dlls in Visual Studio C# Projekte einbinden
Prolog:
Gestern erhielt ich folgende Mail von Christoph.
hallo webmaster,
ich möchte gerne meine webcam
in meinem C#-Projekt einbinden (auf deiner Seite gut beschrieben)
Ich habe die dll’s runtergeladen und
nun weiß ich nicht wie ich sie
unter Microsoft Visual Studios 2008 einbinden kann
würde mich auf Antwort freuen
Mit freundlichen Grüßen Christoph
Für all jene, die noch nicht so lange dabei sind – Christoph bezieht sich auf folgenden Artikel. Aber nun zu seinem Problem. Wie bindet man Dlls im Visual Studio in ein laufendes Projekt ein?
Lösung:
Die Lösung des Problems liegt näher als manch einer von euch denken mag. Zuerst macht ihr einen Rechtsklick auf den Eintrag “Verweise” im Projektmappen-Explorer und klickt in dem sich öffnenden Kontextmenü auf “Verweis hinzufügen”. (Bild 1)
Nun geht ihr auf den Reiter “Durchsuchen”, wählt die gewünschten (.Net kompatiblen) Dlls aus und bestätigt eure Auswahl mit einem Klick auf den Ok-Button. (Bild 2)
Im letzten Schritt könnt ihr noch die entsprechenden Using-Direktiven in eurem Quellcode hinzufügen um einen einfacheren Zugriff auf die Methoden der Dlls zu erlangen. (Bild 3)
Das war’s auch schon. Ich hoffe ich habe das Thema verständlich genug erklärt. Sollten dennoch Fragen aufgekommen sein, gilt das gleiche wie immer – ab in die Kommentare damit!
Viele Grüße,
Raffi





