2013-08-20 9 views
7

In un programma C, desidero ordinare un elenco di stringhe con codifica UTF-8 valida nell'ordine Unicode code point. Nessuna collazione, nessuna consapevolezza della localizzazione.Will strcmp confronta le stringhe utf-8 nell'ordine del codice?

Quindi ho bisogno di una funzione di confronto. È abbastanza facile scrivere una funzione simile che itera sui caratteri Unicode. (Mi capita di essere utilizzando GLib, quindi mi piacerebbe iterare con g_utf8_next_char e confrontare i valori di ritorno di g_utf8_next_char.)

Ma quello che mi chiedo, per curiosità e, eventualmente, semplicità ed efficienza, è: sarà un semplice byte -per-byte strcmp (o g_strcmp) effettivamente fare lo stesso lavoro? Sto pensando che, dal momento che UTF-8 encodes i bit più significativi per primi, e un punto di codice che ha bisogno di codifica in N + 1 byte avrà un byte iniziale più grande di un punto di codice che deve essere codificato in N byte.

Ma forse mi manca qualcosa? Grazie in anticipo.

risposta

7

Sì, UTF-8 conserva l'ordine di codice, quindi è possibile utilizzare solo strcmp. Questo è uno dei (molti) bei punti di UTF-8.

Un avvertimento è che codepoints in Unicode sono UTF-32 valori, e alcune persone che parlano di fascicolazione stringhe Unicode per "codepoint" sono in realtà usando la parola "codepoint" in modo non corretto per significare "UTF-16 unità di codice ". Se si desidera che l'ordine corrisponda alle regole di codifica UTF-16, è necessario un po 'più di lavoro.

+0

Grazie mille! Stavo per seguire il mio caso d'uso e come non penso che l'avvertenza si applichi, e poi ho visto che questa informazione è proprio lì [nello standard] (http://www.w3.org/TR/xml- c14n # DocumentOrder) Sto cercando di implementare: "Il confronto lessicografico, che ordina le stringhe dal meno al massimo in ordine alfabetico, si basa sui valori dei punti di codice UCS, che è equivalente all'ordine lessicografico basato su UTF-8." '' :-) – skagedal