2013-08-20 6 views
7

In einem C-Programm möchte ich eine Liste von gültigen UTF-8-codierten Zeichenfolgen in Unicode-Codepunkt-Reihenfolge sortieren. Keine Sortierung, keine Gebietskenntnis.Wird strcmp utf-8 Zeichenfolgen in Codepunkt-Reihenfolge vergleichen?

Also brauche ich eine Vergleichsfunktion. Es ist einfach genug, eine solche Funktion zu schreiben, die über die Unicode-Zeichen iteriert. (Ich bin zufällig zu GLib verwenden, so würde ich iterieren mit g_utf8_next_char und die Rückgabewerte von g_utf8_next_char vergleichen.)

Aber was ich frage mich, aus Neugier und möglicherweise Einfachheit und Effizienz, ist: Wird ein einfaches Byte -für-Byte strcmp (oder g_strcmp) tatsächlich die gleiche Arbeit? Ich denke, dass es, da UTF-8 encodes die höchstwertigen Bits zuerst, und ein Codepunkt, der Codierung in N + 1 Bytes benötigt, ein größeres Anfangsbyte als einen Codepunkt haben muss, der in N Bytes codiert werden muss.

Aber vielleicht fehlt mir etwas? Danke im Voraus.

Antwort

7

Ja, UTF-8 behält die Codepunkt-Reihenfolge bei, so dass Sie einfach strcmp verwenden können. Das ist einer der (vielen) schönen Punkte von UTF-8.

Ein Nachteil ist, dass Codepoints in Unicode UTF-32-Werte und einige Leute, die über Sortier Unicode-Strings in „Codepunkt“ sprechen, um verwenden tatsächlich das Wort „Codepoint“ falsch „UTF-16 Code-Einheit zu bedeuten ". Wenn Sie möchten, dass die Reihenfolge der UTF-16-Code-Einheit-Sortierung übereinstimmt, ist ein gutes Stück mehr Arbeit erforderlich.

+0

Vielen Dank! Ich wollte meinem Anwendungsfall folgen und denke, dass der Vorbehalt nicht zutrifft, und dann sah ich, dass diese Information in [dem Standard] (http://www.w3.org/TR/xml- c14n # DocumentOrder) Ich versuche zu implementieren: "Lexikographischer Vergleich, der Strings vom kleinsten zum größten alphabetisch sortiert, basiert auf den UCS-Codepunktwerten, die äquivalent zu lexikographischer Ordnung basierend auf UTF-8 sind." ':-)' – skagedal

Verwandte Themen