2010-12-29 10 views
1

Ich ziehe einige internationalisierte Text aus einer MS SQL Server 2005-Datenbank. Entsprechend den Voreinstellungen für diesen DB werden die Zeichen als UCS-2 gespeichert. Allerdings muss ich die Daten im UTF-8-Format ausgeben, da ich sie über das Internet sende. Derzeit habe ich den folgenden Code zu konvertieren:Convert UCS-2-Zeichen in UTF-8 mit C#

SqlString dbString = resultReader.GetSqlString(0); 
byte[] dbBytes = dbString.GetUnicodeBytes(); 
byte[] utf8Bytes = System.Text.Encoding.Convert(System.Text.Encoding.Unicode, 
    System.Text.Encoding.UTF8, dbBytes); 
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding(); 
string outputString = encoder.GetString(utf8Bytes); 

Allerdings, wenn ich die Ausgabe im Browser untersuchen, scheint es, Müll zu sein, egal was stelle ich die Codierung.

Was fehlt mir?

EDIT: Als Antwort auf die Antworten unten, der Grund, ich dachte, dass ich eine Konvertierung durchführen musste, ist, weil ich Literal Multibyte Strings ganz gut ausgeben kann. Zum Beispiel:

OutputControl.Text = "カルフォルニア工科大学とチューリッヒ工科大学は共同で、太陽光を保管可能な燃料に直接変えることのできる装置の開発に成功したとのこと"; 

funktioniert. Hier ist OutputControl ein ASP.Net Literal. Jedoch

OutputControl.Text = outputString; //Output from above snippet 

führt zu Mangled-Ausgabe wie oben beschrieben. Meine Hypothese war, dass die Ausgabe der Datenbank irgendwie von ASP.Net gestört wurde. Wenn das nicht der Fall ist, was sind dann andere Möglichkeiten?

EDIT 2: Okay, ich bin dumm. Es stellt sich heraus, dass an der Datenbank überhaupt nichts falsch ist. Als ich versuchte, meine eigenen Literal-Doppelbyte-Zeichen (材料,原料;木料) einzufügen, konnte ich sie ohne jeglichen Umwandlungsprozess lesen und ausgeben. Es scheint mir, dass das, was auch immer die Daten in die DB einfügt, die Charaktere irgendwie verfälscht, also werde ich mir das ansehen. Mit meinen verifizierten, "sauberen" Daten funktioniert der folgende Code:

wie die Antworten unten angeben, sollte es.

+0

Woran denken Sie, dass Sie in UTF-8 konvertieren müssen? – Gabe

+0

Und wenn Sie meine Frage vor 6 Stunden beantwortet hatten, irr, macht nichts ... –

Antwort

4

Ihr Code macht im Wesentlichen die gleiche wie:

SqlString dbString = resultReader.GetSqlString(0); 
string outputString = dbString.ToString(); 

string selbst ist eine UNICODE-Zeichenfolge (genauer gesagt, UTF-16, das ist 'fast' das gleiche wie UCS-2, mit Ausnahme von Codepoints nicht passend in die niedrigsten 16 Bits). Mit anderen Worten, die von Ihnen ausgeführten Conversions sind redundant.

Ihre Web-App manipuliert höchstwahrscheinlich auch die Kodierung an anderer Stelle oder setzt eine falsche Kodierung für die HTML-Ausgabe. Dies kann jedoch anhand der von Ihnen bereitgestellten Informationen nicht diagnostiziert werden.

+0

Es ist nicht redundant, wenn er UTF-8 Bytes ausgeben will. –

+0

@GregS Er macht es an einem völlig falschen Ort. Ich nehme an, er macht eine ASP.NET-Web-App, also ist HTML-Ausgabe-Codierung keine Frage für seinen benutzerdefinierten Code. –

+1

Wie ist das eine Antwort? Es erklärt nicht, warum UTF-8 nicht richtig angezeigt wird. – Gabe

0

Zeichenfolge in .net ist 'Codierung agnostic'.

Sie können Bytes-String mit einer bestimmten Codierung konvertieren .net zu sagen, wie Sie Ihren Bytes interpretiert.

Sie können Zeichenfolge-Bytes mit einer bestimmten Codierung konvertieren .net sagen, wie Sie Ihr Bytes bedient werden sollen.

Doch der Versuch, eine Zeichenfolge auf eine anderen String mit Kodierungen zu konvertieren macht überhaupt kein sens.

+1

Dies sollte ein Kommentar sein; es beantwortet die Frage nicht. – Gabe