Wie konvertiert man ein Unicode-Zeichen in sein ASCII-Äquivalent?

Hier ist das Problem:

In C # erhalte ich Informationen aus einer Legacy ACCESS-database. .NET konvertiert den Inhalt der database (im Falle dieses Problems eine Zeichenkette) in Unicode, bevor er den Inhalt an mich übermittelt.

Wie konvertiere ich diese Unicode-Zeichenkette wieder in ihr ASCII-Äquivalent?


Bearbeiten
Unicode char 710 ist tatsächlich MODIFIER BRIEF CIRCUMFLEX ACCENT. Hier ist das Problem etwas genauer:

  -> (Erweitertes) ASCII-Zeichen ê (Extended ASCII 136) wurde in die database eingefügt.
  -> Access oder die Lese-Komponente in .NET konvertiert diese in U + 02C6 U + 0065
     (MODIFIER Brief CIRCUMFLEX ACCENT + LATEIN KLEINER BUCHSTABE E)
  -> Ich brauche das (Extended) ASCII Zeichen 136 zurück.


Hier ist, was ich versucht habe (ich sehe jetzt, warum das nicht funktioniert hat …):

string myInput = Convert.ToString(Convert.ToChar(710)); byte[] asBytes = Encoding.ASCII.GetBytes(myInput); 

Aber das ergibt nicht 94, sondern ein Byte mit dem Wert 63 …
Hier ist ein neuer Versuch, aber es funktioniert immer noch nicht:

 byte[] bytes = Encoding.ASCII.GetBytes("ê"); 


Lösung
Dank sowohl csgero als auch bzlm für das Zeigen in die richtige Richtung habe ich das Problem hier getriggers.

Okay, lass uns das näher ausführen. Sowohl csgero als auch bzlm zeigten in die richtige Richtung.

Aufgrund der Antwort von blzm habe ich die Windows-1252-Seite im Wiki nachgeschlagen und festgestellt, dass es sich um eine Codepage handelt. Der wikipedia-Artikel für die Code-Seite , der folgendes besagt:

Für diese ” erweiterten Zeichensätze ” gab es keinen formellen Standard; IBM bezeichnete die Varianten lediglich als Codepages, wie es bei Varianten von EBCDIC-Codierungen immer der Fall war.

Dies führte mich zu Codepage 437:

n ASCII-kompatible Codeseiten, die unteren 128 Zeichen behielten ihre Standard-US-ASCII-Werte, und verschiedene Seiten (oder Zeichensätze) konnten in den oberen 128 Zeichen zur Verfügung gestellt werden. DOS-Computer, die für den nordamerikanischen Markt gebaut wurden, verwendeten beispielsweise die Codepage 437 , die akzentuierte Zeichen enthielt, die für Französisch, Deutsch und einige andere europäische Sprachen benötigt wurden, sowie einige graphische Linienzeichnungszeichen.

Also, Codepage 437 war die Codepage, die ich ‘Extended ASCII’ nannte, sie hatte das ê als Zeichen 136, also habe ich auch ein paar andere Zeichen nachgeschlagen und sie scheinen richtig zu sein.

csgero kam mit dem Encoding.GetEncoding () – Hinweis, ich habe es verwendet, um die folgende statement zu erstellen, die mein Problem triggers:

 byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê"); 

Sie können hier nicht die Standard-ASCII-Codierung (Encoding.ASCII) verwenden, sondern die Codierung mit der entsprechenden Codepage unter Verwendung von Encoding.GetEncoding (…) erstellen. Sie könnten versuchen, die Codepage 1252 zu verwenden, die eine Obermenge von ISO 8859-1 ist.

ASCII definiert nicht ê; die Nummer 136 kommt von der Nummer für den Zirkumflex in 8-Bit-Codierungen wie Windows-1252.

Können Sie überprüfen, ob in diesem Fall ein kleines e mit einem Zirkumflex (ê) tatsächlich in der Access-database gespeichert wird? Vielleicht ist U + 02C6 U + 0065 das Ergebnis eines Konvertierungserrorss, bei dem die Eingabe tatsächlich ein e ist, gefolgt von einem Zirkumflex oder etwas ganz anderem. Möglicherweise hat Ihre Access-database beschädigte Daten in dem Sinne, dass die angegebene Codierung nicht mit dem Inhalt übereinstimmt. In diesem Fall könnte der .NET-Client die Daten falsch analysieren (mit dem falschen Decoder).

Wenn dieser Fehler tatsächlich während des Lesens aus der database eingeführt wird, kann das Einfügen von Code oder Konfigurationseinstellungen hilfreich sein.

In Codepage 437 ist die Zeichenzahl 136 ein e mit einem Zirkumflex.

Hmm … Ich bin mir nicht sicher, welchen Charakter du meinst. Das Caret (“^”, CIRCUMFLEX ACCENT) hat den gleichen Code in ASCII und Unicode (U + 005E).

/ EDIT: Verdammt, meine Schuld. 710 (U + 02C6) ist eigentlich der MODIFIERER LETTER CIRCUMFLEX ACCENT. Leider gehört dieses Zeichen überhaupt nicht zu ASCII. Es könnte wie der normale Caret aussehen, aber es ist ein anderer Charakter. Einfache Konvertierung wird hier nicht helfen. Ich bin mir nicht sicher, ob .NET die Abbildung ähnlicher Zeichen bei der Konvertierung von Unicode unterstützt. Aber es lohnt sich zu untersuchen.

Der Wert 63 ist das Fragezeichen, AKA “Ich kann dieses Zeichen nicht in ASCII anzeigen”.