2010-12-27 2 views
2

Ich habe ein sehr interessantes Problem. Einer, auf den ich noch keine Antwort finden kann. der Code wie folgtC# " xC0 x80" gesendet als C0 3f ... Seltsames Problem kann die Lösung nicht herausfinden

Console.WriteLine("\xc0\x80"); 
Console.WriteLine(Encoding.GetEncoding(1252).GetString(new byte[] { 0xC0, 0x80 })); 
Console.WriteLine(Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(1252).GetBytes("\xc0\x80"))); 

byte[] bt = new byte[2]; 
bt[0] = (byte)'\xC0'; 
bt[1] = (byte)'\x80'; 
Console.WriteLine(Encoding.GetEncoding(1252).GetString(bt)); 

die folgende Ausgabe erzeugt:

À? 
À€ 
À? 
À€ 

wenn sie an Bytes codiert unter Verwendung von 1252 Codepage "\ XC0 \ x80" erzeugt C0 3f ..

jedoch, wenn i direkt in ein Bytearray umwandeln, die Bytes sind C0 80

Vorschläge?

Auch der gleiche Code von vs in einer anderen Maschine lief, produziert À € in jeder Zeile ... Das Problem isent so sehr die Codepage, es habe eine Einstellung in vs oder in Fenstern verursacht den Nachschlag sein von meiner Standard-Codepage zu 1252.

+4

Ich frage mich, wie Sie eine Zeichenfolge in ein Byte-Array zu werfen. –

+0

@Darin: Mit Encoding.GetEncoding (1252). GetBytes (str). Natürlich ist das keine Besetzung, aber ich nehme an, dass es das ist, was er meinte. – Amy

+0

@ yodaj007, dies ist nicht Casting, dies wird mit Codierung konvertieren. Ich frage nach der zweiten Methode, die das OP beschreibt, wo er sagt, ich zitiere: "Wenn ich es direkt auf ein Bytearray werfe, sind die Bytes C0 80". Ich war nur neugierig auf dieses * Casting *, da es nicht viel Sinn ergibt. –

Antwort

4

3f ist ein Fragezeichen. Es wird erzeugt, weil CP 1252 das Zeichen U + 0080 (welches ein Steuerzeichen ist) nicht unterstützt; in CP 1252 ist Byte 80 U + 20AC (EURO SIGN).

Wenn Sie ein EURO-Zeichen in der Zeichenfolge 1252 möchten, fügen Sie es auch in die Variable str ein (z. B. als \ u20ac).

bearbeiten: Deins Beispiele eins nach dem anderen:

Console.WriteLine("\xc0\x80"); 

Ihr Terminal nicht den Charakter \ x80 unterstützt (PAD - Padding-Zeichen), so dass es ein Fragezeichen druckt.

Console.WriteLine(Encoding.GetEncoding(1252). 
    GetString(new byte[] { 0xC0, 0x80 })); 

Der GetString-Aufruf gibt Ihnen "\ xc0 \ u20ac". Wenn Sie dies dem Zeichensatz des Terminals zuordnen, erhalten Sie das EURO-ZEICHEN.

Console.WriteLine(Encoding.GetEncoding(1252).GetString(
     Encoding.GetEncoding(1252).GetBytes("\xc0\x80"))); 

GetBytes gibt Ihnen {0xC0, 0x3f}. GetString gibt Ihnen dann "\ xC0?", Und das wird gedruckt.

Console.WriteLine(Encoding.GetEncoding(1252).GetString(bt)); 

Dies ist wirklich der gleiche Code wie das zweite Beispiel.

+0

Das ist richtig, aber die Umwandlung aus dem Zeichen \ x80 in ein Byte erzeugt nicht das gleiche wie die Codierung von "\ x80" auf meinem Rechner, der gleiche Code, lief auf einer anderen Maschine. Nachdem mein Code nach IL kompiliert wurde, könnte ich mich wirklich weniger darum kümmern, da IL das Gebietsschema mit der Codierungsklasse behandelt. – john

+0

Siehe meine Bearbeitung; Ich habe die spezifische Ausgabe erklärt. Beachten Sie, dass Sie in Ihrem Code nie "aus dem Zeichen \ x80" umwandeln. Dieses Zeichen erscheint überhaupt nicht (außer als Teil einer Zeichenkette) - nur ein Byte 0x80 erscheint, aber das ist kein Zeichen (es ist ein Byte). char! = Byte –