Gibt es eine Möglichkeit, von UTF8 nach ISO-8859-1 zu konvertieren?

7

Meine Software erhält in UTF8 einige Zeichenfolgen, die ich in ISO 8859 1 konvertieren muss. Ich weiß, dass die UTF8-Domäne größer ist als iso 8859. Aber die Daten in UTF8 wurden zuvor von ISO hochkonvertiert, also sollte ich nichts verpassen .

Ich würde gerne wissen, ob es eine einfache / direkte Möglichkeit gibt, von UTF8 nach iso-8859-1 zu konvertieren.

Danke

    
fazineroso 22.06.2012, 12:47
quelle

2 Antworten

11

Hier ist eine nützliche Funktion: utf8_to_latin9() . Es konvertiert zu ISO-8859-15 (einschließlich EURO, was ISO-8859-1 nicht hat), funktioniert aber auch korrekt für den UTF-8 - & gt; ISO-8859-1 Umwandlungsteil eines ISO-8859-1 - & gt; UTF-8 - & gt; ISO-8859-1 round-trip.

Die Funktion ignoriert ungültige Code-Punkte, die dem //IGNORE -Flag für iconv ähnlich sind, aber zerlegt keine zerlegten UTF-8-Sequenzen; Das bedeutet, dass U+006E U+0303 nicht in U+00F1 umgewandelt wird. Ich rege mich nicht um, weil iconv auch nicht.

Die Funktion ist sehr vorsichtig beim Zugriff auf die Zeichenkette. Es wird niemals über den Puffer hinaus gescannt. Der Ausgabepuffer muss ein Byte länger als die Länge sein, da er immer das NULL-Byte am Ende der Zeichenfolge anfügt. Die Funktion gibt die Anzahl der Zeichen (Bytes) in der Ausgabe zurück, ohne das NULL-Byte am Ende der Zeichenfolge.

%Vor%

Beachten Sie, dass Sie benutzerdefinierte Transliterationen für bestimmte Codepunkte in der Funktion to_latin9() hinzufügen können. Sie sind jedoch auf den Ersatz von ein Zeichen beschränkt.

Wie es derzeit geschrieben wird, kann die Funktion die direkte Konvertierung sicher durchführen: Eingabe- und Ausgabezeiger können gleich sein. Die Ausgabezeichenfolge wird niemals länger als die Eingabezeichenfolge sein. Wenn Ihre Eingabezeichenfolge Platz für ein zusätzliches Byte bietet (z. B. wenn der NUL die Zeichenfolge beendet), können Sie die obige Funktion verwenden, um sie von UTF-8 in ISO-8859-1 / 15 zu konvertieren. Ich habe es bewusst so geschrieben, weil es Ihnen in einer eingebetteten Umgebung etwas Mühe ersparen sollte, obwohl dieser Ansatz etwas eingeschränkt ist. Anpassung und Erweiterung.

Bearbeiten:

Ich habe ein Paar von Konvertierungsfunktionen hinzugefügt in einer Bearbeitung dieser Antwort für beide Latein-1/9 zu / von UTF-8-Konvertierung (ISO-8859-1 oder -15 zu / von UTF-8); Der Hauptunterschied besteht darin, dass diese Funktionen eine dynamisch zugewiesene Kopie zurückgeben und die ursprüngliche Zeichenfolge intakt halten.

    
Nominal Animal 23.06.2012, 22:31
quelle
11
  

iconv - führt eine Zeichensatzkonvertierung durch

     

size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);

     

iconv_t iconv_open(const char *tocode, const char *fromcode);

tocode ist "ISO_8859-1" und fromcode ist "UTF-8" .

Arbeitsbeispiel:

%Vor%     
kay 22.06.2012 12:49
quelle