2010-09-15 7 views
5

Ho una semplice domanda che non riesco a trovare da nessuna parte su Internet, come posso convertire UTF-8 in ASCII (caratteri accentati per lo stesso carattere senza accento) in C usando solo la lib standard? Ho trovato soluzioni per la maggior parte delle lingue là fuori, ma non per C in particolare.UTF-8 -> ASCII in linguaggio C

Grazie!

EDIT: Alcuni dei tipi che hanno commentato mi hanno fatto ricontrollare ciò di cui avevo bisogno e ho esagerato. Ho solo bisogno di un'idea su come realizzare una funzione che funzioni: char con accento -> char senza accento. :)

+0

Non è nella libreria standard, quindi è necessario specificare su quali piattaforme si ha realmente bisogno di ciò per cui lavorare. –

+0

Probabilmente Linux. – dccarmo

+1

@dccarmo - Lo standard C non è ad es. lo standard Posix. Essere disponibile su Linux, o addirittura essere affidato a Posix, non lo rende una libreria standard * C *. – Steve314

risposta

2

Non c'è un modo integrato per farlo. C'è davvero poca differenza tra UTF-8 e ASCII a meno che tu non stia parlando di personaggi di alto livello, che comunque non possono essere rappresentati in ASCII.

Se si dispone di una mappatura specifica desiderata (come ad esempio con accento -> a), si dovrebbe probabilmente gestirla come un'operazione di sostituzione stringa.

+0

Ma quando provo a fare un if (c == 'á') {c = 'a'; } mi dà "il confronto è sempre falso a causa della limitata gamma di tipi di dati" :( – dccarmo

+0

@dccarmo: ''á'' sembra'' \ 0703 \ 0120'' a C, quindi è una costante che è più grande di un 'char' può contenere, quindi se' c' è un char non c'è modo che sia mai uguale a quello che è probabile che sia uguale a ''\ 0703'' e il prossimo carattere nel tuo stream sarebbe il' '\ 0120''. – nategoose

+0

@nategoose: rimuovi gli zeri iniziali, non sono validi in caratteri di escape di carattere C. "\ 0703 \ 0120' viene analizzato come' \ 070', '3',' \ 012', ' 0'. –

5

Dai uno sguardo allo libiconv. Anche se insisti a farlo senza biblioteche, potresti trovare un'ispirazione lì.

+0

Credo che violi "utilizzando solo la lib standard" –

+0

@Billy - non se solo una persona legge i sorgenti libiconv (ad esempio per copiare gli intervalli di codice). – Steve314

+0

Gli darò un'occhiata, grazie! – dccarmo

4

In generale, non è possibile. UTF-8 copre molto più dei caratteri accentati.

2

Ogni libreria di supporto Unicode decente (non la libreria standard, ovviamente) ha un modo per decomporre una stringa in KC o KD. Che separa i segni diacritici dalle lettere. Darti una possibilità di filtrarli. Non è così sicuro che valga la pena perseguire, il risultato è semplicemente incomprensibile per il lettore di madrelingua e non tutte le lettere sono decomponibili. In altre parole, spazzatura con punti interrogativi.

+0

Sì, ho esagerato sulla mia domanda. Voglio davvero convertire il carattere accentato -> char senza accento. Odio il mio insegnante solo permettendoci di farlo con la lib standard e anche in C. Se potessi usare solo Python. :( – dccarmo

+2

Hai scelto la classe sbagliata, non puoi aiutarti con quello. –

2

Dato che questo è compito, immagino che il tuo insegnante non abbia conoscenze e non sappia nulla di UTF-8, e probabilmente è bloccato negli anni '80 con "code page" e "ASCII esteso" (parole che dovresti cancellare dal tuo vocabolario se non l'hai già fatto). Probabilmente il tuo insegnante vuole che tu scriva una tabella di ricerca di 128 byte che mappa i byte CP437 o Windows-1252 nell'intervallo 128-255 a lettere ASCII dall'aspetto simile. Andrebbe qualcosa di simile ...

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