Wie konvertiert man utf-8 nach ASCII in C ++?

8

Ich bekomme eine Antwort vom Server in utf-8, kann das aber nicht lesen. Wie konvertiert man utf-8 nach ASCII in C ++?

    
Suri 05.06.2010, 12:07
quelle

9 Antworten

23

Bitte beachten Sie, dass ASCII ein 7-Bit-Format ist. Es gibt 8-Bit-Kodierungen, wenn Sie nach einer dieser (wie ISO 8859-1) suchen, müssen Sie genauer sein.

Um eine ASCII-Zeichenfolge in UTF-8 zu konvertieren, tun Sie nichts: Sie sind identisch. Wenn also Ihre UTF-8-Zeichenfolge nur aus ASCII-Zeichen besteht, ist sie bereits eine ASCII-Zeichenfolge und es ist keine Konvertierung erforderlich.

Wenn die UTF-8-Zeichenfolge Nicht-ASCII-Zeichen (alles mit Akzenten oder nicht-lateinischen Zeichen) enthält, gibt es keine Möglichkeit, sie in ASCII zu konvertieren. (Möglicherweise können Sie es möglicherweise in eine der ISO-Kodierungen konvertieren.)

Es gibt Möglichkeiten, die Akzente von lateinischen Zeichen zu entfernen, um zumindest eine gewisse Ähnlichkeit in ASCII zu bekommen. Wenn Sie nur die Nicht-ASCII-Zeichen löschen möchten, löschen Sie einfach alle Bytes mit Werten & gt; = 128 aus der Zeichenfolge utf-8.

    
Artelius 05.06.2010, 12:14
quelle
9

Dieses Beispiel funktioniert unter Windows (Sie haben Ihr Zielbetriebssystem nicht erwähnt):

%Vor%

Denken Sie daran, dass delete[] wide; und / oder ansi nicht mehr benötigt werden. Da dies Unicode ist, würde ich empfehlen, bei wchar_t* anstelle von char* zu bleiben, es sei denn, Sie sind sicher, dass der Eingabepuffer Zeichen enthält, die zu derselben ANSI-Untergruppe gehören.

    
Aoi Karasu 05.06.2010 14:40
quelle
4

UTF-8 ist eine Kodierung, die jedes Unicode-Zeichen abbilden kann. ASCII unterstützt nur eine sehr kleine Untermenge von Unicode.

Für die Untergruppe von Unicode, die ASCII ist, ist die Zuordnung von UTF-8 zu ASCII eine direkte Eins-zu-Eins-Bytezuordnung. Wenn der Server Ihnen also ein Dokument sendet, das nur ASCII-Zeichen in UTF-8-Codierung enthält Sie können das direkt als ASCII lesen.

Wenn die Antwort Nicht-ASCII-Zeichen enthält, können Sie sie nicht in ASCII ausgeben. Um diese aus einem UTF-8-Stream herauszufiltern, können Sie einfach jedes Byte & gt; = 128 (0x80 hex) herausfiltern.

    
Charles Bailey 05.06.2010 12:11
quelle
4

Wenn die Zeichenfolge Zeichen enthält, die nicht in ASCII vorhanden sind, gibt es nichts, was kann , da diese Zeichen in ASCII nicht existieren.

Wenn die Zeichenkette nur Zeichen enthält, die tun in ASCII existieren, dann brauchen Sie nichts zu tun, da die Zeichenkette bereits in der ASCII-Kodierung: UTF-8 wurde speziell dafür entwickelt, abwärtskompatibel zu ASCII zu sein, so dass jedes Zeichen, das in ASCII ist, die gleiche Kodierung in UTF-8 hat wie in ASCII , und dass jedes Zeichen, das nicht in ASCII ist, nie eine Kodierung haben kann, die gültiges ASCII ist, dh immer eine Kodierung haben wird, die illegal ist in ASCII (speziell wird jedes Nicht-ASCII-Zeichen als eine Folge von 2-4 Oktetten codiert, von denen alle ihr höchstwertiges Bit gesetzt haben, dh, sie haben einen ganzzahligen Wert & gt; 127).

Anstatt einfach zu versuchen, die Zeichenfolge zu konvertieren , könnten Sie versuchen, die Zeichenfolge zu transkribieren . Die meisten Sprachen auf diesem Planeten haben eine Art ASCII-Transliterationsschema, das den Text zumindest einigermaßen verständlich macht. Zum Beispiel ist mein Vorname "Jörg" und seine ASCII-Transliteration wäre "Joerg". Der Name des Erstellers der Programmiersprache Ruby lautet "ま つ も と ゆ き ろ and and and and and and and and and and and its its its its its its its its its its its its its its its its its its its its its Beachten Sie jedoch, dass Sie Informationen verlieren. Zum Beispiel wird die deutsche sz-Ligatur in "ss" transkribiert, so dass das Wort "Maße" in "Masse" transkribiert wird. "Masse" (Masse, im Sinne des Physikers, nicht des Christen) ist jedoch auch ein Wort. Als ein anderes Beispiel hat Türkisch 4 "i" s (klein und groß, mit und ohne Punkt) und ASCII hat nur 2 (klein mit Punkt und Großbuchstabe ohne Punkt), deshalb werden Sie entweder Informationen über den Punkt verlieren oder ob es oder nicht war ein Großbuchstabe.

Die Methode only , die keine Informationen verliert (mit anderen Worten: beschädigte Daten), besteht also darin, die Nicht-ASCII-Zeichen in Sequenzen von ASCII-Zeichen zu codieren . Es gibt viele gängige Codierungsschemata: SGML-Entitätsverweise, MIME, Unicode-Escape-Sequenzen, Τ Ε Χ oder LaΤ Ε Χ. Also würden Sie die Daten codieren, wenn sie in Ihr System gelangen, und sie entschlüsseln, wenn sie das System verlassen.

Natürlich wäre der einfachste Weg, Ihr System einfach zu reparieren.

    
Jörg W Mittag 05.06.2010 13:17
quelle
1

Überprüfen Sie diese utf-8 String-Bibliothek , vergessen Sie nicht, sie in ASCII umzuwandeln.

    
Kronen 05.06.2010 13:43
quelle
0

UTF-8 ist abwärtskompatibel mit ASCII, dh alle ASCII-Zeichen sind in UTF-8 als einzelne unveränderte Byte-Werte codiert. Wenn der Text ASCII sein soll, Sie ihn aber nicht lesen können, muss ein anderes Problem auftreten.

    
Mike Weller 05.06.2010 12:10
quelle
0

ASCII ist eine Codepage, die 128 Zeichen und Steuercodes darstellt, wobei utf8 jedes Zeichen im Unicode-Standard darstellen kann, das viel mehr mit ASCII-Fähigkeiten zu tun hat. Also Antwort auf Ihre Frage ist: Nicht möglich Es sei denn, Sie haben weitere Spezifikationen für die Datenquelle.

    
Learner 05.06.2010 13:31
quelle
0

Beachten Sie, dass es zwei UTF8 -Typen gibt: UTF8_with_BOM und UTF8_without_BOM . Und Sie müssen anders für sie in ANSI konvertieren. Die folgenden Funktionen funktionieren.

  • UTF8_mit_BOM bis ANSI

    %Vor%
  • UTF8_without_BOM bis ANSI

    %Vor%
herohuyongtao 26.12.2013 05:24
quelle
-3

Zur Formulierung

  

"Wenn die Zeichenfolge Zeichen enthält, die nicht in ASCII vorhanden sind, gibt es nichts, was Sie tun können, denn diese Zeichen existieren im ASCII-Format nicht."

es ist falsch.

UTF-8 ist ein Multibyte-Code und kann mehr als zwei Sätze von Symbolen (Sprachen) enthalten. Praktisch haben Sie entweder einzelne Sprache (Englisch wie üblich) oder 2 Sprachen, von denen eine Englisch ist.

  • Der erste Fall ist ein einfaches ASCII-Zeichen (beliebige Codierung).
  • Die zweite beschreibt die entsprechende Codierung von ASCII-Zeichen. Wenn es nicht Chinesisch oder Arabisch ist.

Unter den obigen Bedingungen können Sie UTF-8 in ASCII-Zeichen konvertieren. Entsprechendes funktionales gibt es in C ++ nicht. So können Sie es manuell tun. Es ist einfach, zwei Bytesymbole von 1 Byte zu erkennen. Das High-Bit des ersten Bytes wird für Zwei-Byte-Einsen gesetzt und ansonsten deaktiviert.

    
Anatoly 27.07.2013 21:53
quelle

Tags und Links