Beachten Sie, dass C # -Strings Sequences von Char-, UTF-16-Code-Einheiten sind. Sie sind nicht Unicode-Codepunkte. Einige Unicode-Codepunkte erfordern zwei Zeichen, und Sie sollten keine Strings zwischen diesen Zeichen teilen.
Außerdem können sich Unicode-Codepunkte zu einem einzigen "Zeichen" zusammenfassen - zum Beispiel ein "u" Char gefolgt von Umlat Char. Sie können also keine Strings zwischen beliebigen Codepunkten aufteilen.
Im Grunde sind es Probleme, bei denen ein bestimmtes Problem nur in der Praxis auf Sprachen wirkt, die Sie nicht kennen.
C # (und .Net im Allgemeinen) behandeln Unicode-Zeichenfolgen transparent, und Sie müssen nichts Spezielles tun, es sei denn, Ihre Anwendung muss Dateien mit bestimmten Codierungen lesen / schreiben. In diesen Fällen können Sie verwaltete Zeichenfolgen in Byte-Arrays der gewünschten Codierung konvertieren, indem Sie die Klassen im System.Text.Encodings-Namespace verwenden.
System.String wurde bereits intern mit Unicode behandelt, so dass Sie dort behandelt werden. Es empfiehlt sich, System.Text.Encoding.UTF8Encoding beim Lesen und Schreiben von Dateien zu verwenden. Es ist mehr als nur das Lesen / Schreiben von Dateien. Alles, was Daten aus dem Netzwerk streamt, einschließlich Netzwerkverbindungen, hängt von der Codierung ab. Wenn Sie WCF verwenden, wird für die meisten Bindungen standardmäßig UTF8 verwendet (tatsächlich erlauben die meisten überhaupt kein ASCII).
UTF8 ist eine gute Wahl, da es zwar den gesamten Unicode-Zeichensatz unterstützt, für den Großteil des ASCII-Zeichensatzes jedoch eine Byte-Ähnlichkeit aufweist. Daher haben naive Anwendungen, die Unicode nicht unterstützen, eine gewisse Chance, Ihre Anwendungsdaten zu lesen / schreiben. Diese Anwendungen werden erst dann fehlschlagen, wenn Sie erweiterte Zeichen verwenden.
System.Text.Encoding.Unicode schreibt UTF-16, das mindestens zwei Bytes pro Zeichen enthält, wodurch es sowohl größer als auch vollständig inkompatibel mit ASCII ist. Und System.Text.Encoding.UTF32, wie Sie erraten können, ist noch größer. Ich bin mir nicht sicher, ob UTF-16 und 32 tatsächlich verwendet werden, aber vielleicht sind sie besser, wenn Sie viele erweiterte Zeichen haben. Das ist nur eine Theorie, aber wenn es wahr ist, dann könnten japanische / chinesische Entwickler, die ein Produkt machen, das hauptsächlich in diesen Sprachen verwendet wird, UTF-16/32 als bessere Wahl empfinden.
Denken Sie nur an die Codierung beim Lesen und Schreiben von Streams. Verwenden Sie TextReader und TextWriter, um Text in verschiedenen Kodierungen zu lesen und zu schreiben. Verwenden Sie immer utf-8, wenn Sie eine Wahl haben.
Lassen Sie sich nicht von Sprachen und Kulturen verwirren - das ist ein völlig anderes Thema als Unicode.
.Net hat relativ gute i18n-Unterstützung. Sie müssen nicht wirklich über Unicode nachdenken, so wie alle .NET-Strings und integrierten String-Funktionen mit Unicode das Richtige tun. Es ist nur zu beachten, dass die meisten der String-Funktionen, z. B. DateTime.ToString (), standardmäßig die Kultur des Threads verwenden, die standardmäßig die Windows-Kultur ist. Sie können eine andere Kultur für die Formatierung entweder im aktuellen Thread oder bei jedem Methodenaufruf angeben.
Das einzige Mal, wenn Unicode ein Problem darstellt, ist das Codieren / Decodieren von Strings in und aus Bytes.
Wie bereits erwähnt, behandeln .NET-Zeichenfolgen Unicode transparent. Neben Datei-I / O würde die andere Betrachtung auf der Datenbank-Ebene sein. SQL Server unterscheidet zum Beispiel zwischen VARCHAR (nicht Unicode) und NVARCHAR (die Unicode behandelt). Beachten Sie auch die gespeicherten Prozedurparameter.