2010-09-15 8 views
5

Ich habe eine einfache Frage, die ich nirgendwo im Internet finden kann, wie kann ich UTF-8 in ASCII (meist akzentuierte Zeichen in das gleiche Zeichen ohne Akzent) in C konvertieren Verwenden Sie nur die Standardbibliothek? Ich fand Lösungen für die meisten Sprachen da draußen, aber nicht besonders für C.UTF-8 -> ASCII in C Sprache

Danke!

EDIT: Einige der netten Jungs, die kommentiert haben mich doppelt überprüft, was ich brauchte, und ich übertrieb. Ich brauche nur eine Idee, wie man eine Funktion macht: char mit Akzent -> char ohne Akzent. :)

+0

Es ist nicht in der Standard-Bibliothek, so sollten Sie angeben, welche Plattformen Sie wirklich brauchen, damit zu arbeiten. –

+0

Wahrscheinlich Linux. – dccarmo

+1

@ dccarmo - Der C-Standard ist z.B. der Posix-Standard. Unter Linux verfügbar zu sein oder sogar von Posix beauftragt zu werden, macht es nicht zu einer * C * Standardbibliothek. – Steve314

Antwort

2

Es gibt keine eingebaute Möglichkeit, das zu tun. Es gibt wirklich wenig Unterschied zwischen UTF-8 und ASCII, es sei denn, Sie sprechen von hohen Zeichen, die sowieso nicht in ASCII dargestellt werden können.

Wenn Sie ein bestimmtes Mapping haben möchten (z. B. ein mit Akzent -> a), sollten Sie das wahrscheinlich als String-Ersetzungsvorgang behandeln.

+0

Aber wenn ich versuche, ein if (c == 'á') {c = 'a'; } es gibt mir "Vergleich ist immer falsch wegen der begrenzten Bereich des Datentyps" :( – dccarmo

+0

@dccarmo: ''á'' sieht aus wie' '\ 0703 \ 0120'' zu C, so dass eine Konstante ist, die größer ist als ein 'char' kann halten, also wenn' c' ein char ist, gibt es keine Möglichkeit, dass es dem gleich ist. Was es wahrscheinlich ist, ist '' \ 0703'' und das nächste Zeichen in deinem Stream wäre das '' '\ 0120''. – nategoose

+0

@nategoose: Entferne diese führenden Nullen, sie sind nicht in C-Oktal-Character-Escapes gültig. '\ 0703 \ 0120' wird als' \ 070', '3',' \ 012', 'analysiert 0 ' –

5

Werfen Sie einen Blick auf libiconv. Selbst wenn Sie darauf bestehen, es ohne Bibliotheken zu tun, könnten Sie dort eine Inspiration finden.

+0

Ich glaube, dass verletzt "nur die Verwendung der Standard-lib" –

+0

@ Billy - nicht wenn nur eine Person die libiconv Quellen liest (z. B. um Code-Bereiche zu kopieren). – Steve314

+0

Ich werde es sehen, danke! – dccarmo

4

Im Allgemeinen können Sie nicht. UTF-8 umfasst viel mehr als akzentuierte Zeichen.

2

Jede anständige Unicode-Unterstützungsbibliothek (natürlich nicht die Standardbibliothek) hat eine Möglichkeit, eine Zeichenfolge in KC- oder KD-Form zu zerlegen. Was die Diakritika von den Buchstaben trennt. Ich gebe dir einen Tipp, sie herauszufiltern. Nicht so sicher, dass es sich lohnt zu verfolgen, das Ergebnis ist nur Kauderwelsch für die Muttersprachler und nicht jeder Buchstabe ist zersetzbar. Mit anderen Worten, Müll mit Fragezeichen.

+0

Ja, ich habe meine Frage übertrieben. Ich möchte nur akzentuiertes char -> char ohne Akzent konvertieren. Ich hasse meinen Lehrer, weil er uns das nur mit der Standard-Lib und auch in C erlaubt. Wenn ich nur Python benutzen könnte. :( – dccarmo

+2

Sie haben die falsche Klasse gewählt, kann Ihnen damit nicht helfen. –

2

Da dies Hausaufgaben sind, nehme ich an, Ihr Lehrer ist ahnungslos und weiß nichts über UTF-8, und wahrscheinlich steckt in den 1980er Jahren mit "Codepages" und "erweiterten ASCII" (Wörter, die Sie löschen sollten aus deinem Wortschatz, wenn du es nicht schon getan hast). Ihr Lehrer möchte wahrscheinlich, dass Sie eine 128-Byte-Nachschlagetabelle schreiben, die CP437- oder Windows-1252-Bytes im Bereich von 128-255 ähnlich aussehenden ASCII-Buchstaben zuordnet. Es würde so etwas wie ... gehen

void strip_accents(unsigned char *dest, const unsigned char *src) 
{ 
    static const unsigned char lut[128] = { /* mapping here */ }; 
    do { 
     *dest++ = *src < 128 ? *src : lut[*src]; 
    } while (*src++); 
}