2 Stimmen

c# " \xC0\x80 " gesendet als C0 3f ... Seltsames Problem kann nicht herausfinden, die Lösung

Ich habe ein sehr interessantes Problem. Eines, auf das ich noch keine Antwort gefunden habe. Der Code lautet wie folgt

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));

erzeugt die folgende Ausgabe:

À?

À?

bei Kodierung in Bytes unter Verwendung des Zeichensatzes 1252 " \xc0\x80 " erzeugt C0 3f ..

Wenn ich es jedoch direkt in ein Byte-Array umwandle, sind die Bytes C0 80

Vorschläge?

Auch der gleiche Code lief von vs in einer anderen Maschine, produziert auf jeder Zeile ... Das Problem ist nicht so sehr die Codeseite, es muss eine Einstellung in vs oder in Windows sein die den Lookup von meiner Standard-Codepage auf 1252 verursacht.

4voto

Martin v. Löwis Punkte 120025

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

Wenn Sie ein EURO-Zeichen in der 1252-Zeichenkette wünschen, setzen Sie es auch in die str Variable (z.B. als \u20ac ).

bearbeiten : Ich gehe eines nach dem anderen auf Ihre Beispiele ein:

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

Ihr Terminal unterstützt nicht das Zeichen \x80 (PAD - Padding character), so dass ein Fragezeichen gedruckt wird.

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

Der Aufruf von GetString gibt Ihnen " \xc0\u20ac ". Die Kodierung in den Zeichensatz des Terminals ergibt das EURO-Zeichen.

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

GetBytes liefert { 0xC0, 0x3f}. GetString liefert dann " \xC0 ?", und das wird gedruckt.

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

Dies ist eigentlich derselbe Code wie im zweiten Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X