2010-09-23 22 views
5

Ich habe ein Problem mit der Konvertierung einer Textdatei von ANSI zu UTF8 in C#. Ich versuche, die Ergebnisse in einem Browser anzuzeigen.Konvertieren von Problem ANSI zu UTF8 C#

So habe ich eine Textdatei mit vielen Akzent-Zeichen drin. Es ist in ANSI kodiert, also muss ich es in utf8 umwandeln, weil im Browser statt der Akzentzeichen "?" Erscheint. Egal, wie ich versuchte, zu UTF8 zu konvertieren, es war immer noch ein "?". Aber wenn ich die Textdatei in notepad ++ in utf8 umwandele, werden die Akzentzeichen gut wiedergegeben.

hier ist ein Frieden von Codierung Code, den ich gemacht:

public string Encode(string text) 
    { 
     // encode the string as an ASCII byte array 
     byte[] myASCIIBytes = ASCIIEncoding.ASCII.GetBytes(text); 

     // convert the ASCII byte array to a UTF-8 byte array 
     byte[] myUTF8Bytes = ASCIIEncoding.Convert(ASCIIEncoding.ASCII, UTF8Encoding.UTF8, myASCIIBytes); 

     // reconstitute a string from the UTF-8 byte array 
     return UTF8Encoding.UTF8.GetString(myUTF8Bytes); 
    } 

Sie haben keine Ahnung, warum dies geschieht?

+0

ASCII die Codierung 7-Bit w/o-Code-Seite, wie Andrey erklärt. Wenn es Akzentzeichen enthält, sollten Sie kein ASCII verwenden. –

Antwort

14

Haben Sie eine Idee, warum passiert das?

Ja, Sie sind zu spät. Sie müssen ANSI angeben, wenn Sie die Zeichenfolge aus der Datei lesen. Im Speicher ist immer Unicode (UTF16).

+1

+1 Yup, der Text ist bereits zerstört, bevor er in die Funktion eintritt. –

0

Meine Gedanken hier ist, wenn Sie die Datei in Notepad ++ speichern fügt es die Byte-Order-Mark, so dass der Browser daraus schließen kann, dass es UTF8 ist. Andernfalls müssten Sie dem Browser die Zeichencodierung, wie in der DTD, in XML usw., wahrscheinlich explizit mitteilen.

0

Dies geschieht wahrscheinlich, weil Ihr ursprüngliches string text bereits ungültige Zeichen enthält. Encoding Conversion ist nur sinnvoll, wenn Ihre Eingabe ein Byte-Array ist. Also sollten Sie die Datei als Byte-Array anstelle von Zeichenfolge lesen, oder, wie Henk sagte, geben Sie die Codierung für das Lesen der Datei.

7

Wenn Sie in ASCII konvertieren, verlieren Sie sofort alle nicht-englischen Zeichen (einschließlich der Zeichen mit Akzent), da ASCII nur 127 Zeichen (7 Bits) enthält.

Sie tun seltsame Manipulation. string in .net ist in UTF-16, also, sobald Sie string, nicht byte[] zurückgeben, ist dies egal.

Ich glaube, Sie tun sollten: (Ich denke, nach ANSI meinen Sie Latin1)

public byte[] Encode(string text) 
{ 
    return Encoding.GetEncoding(1252).GetBytes(text); 
} 

Da die Frage nicht ganz klar war es eine vernünftige Bemerkung ist, dass Sie könnte dies tatsächlich benötigen ein:

public string Decode(byte[] data) 
{ 
    return Encoding.GetEncoding(1252).GetString(data); 
} 
+0

+1 für das CodePage-Zeug, Aber ich denke, dass Sie hier die falsche Richtung haben. Das Op muss 'byte []' lesen und eine Funktion, um es ** in ** 'string' zu konvertieren. –

+0

@Henk Holterman Ich habe das Gefühl, dass ich den Fragesteller missverstanden habe.aber seine Funktion nimmt 'string' und gibt' string' zurück, also bin ich mir nicht sicher – Andrey

+0

Ich denke, wir brauchen eine 'string Decodierung (byte [])' –

4

Dies ist wahrscheinlich der einfachste Weg:

byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt"); 
var utf8String = Encoding.Default.GetString(ansiBytes); 
File.WriteAllText("outputfilename.txt", utf8String); 
+0

Wie funktioniert das? Erkennt GetString(), welche Codierung in der Eingabedatei verwendet wurde? Oder funktioniert es einfach, weil UTF-8-Codepunkte korrekt der Latin1-Codepage zugeordnet sind? –