2013-08-20 12 views
7

W programie C, chcę posortować listę prawidłowych łańcuchów zakodowanych w formacie UTF-8 w kolejności kodów Unicode. Bez sortowania, bez świadomości lokalizacji.Czy strcmp porówna ciągi utf-8 w kolejności punktów kodowych?

Potrzebuję funkcji porównania. Łatwo jest napisać taką funkcję, która iteruje po znakach Unicode. (Zdarza mi się używać GLib, tak bym iteracyjne z g_utf8_next_char i porównać wartości zwracanych z g_utf8_next_char.)

Ale co zastanawiam się, z ciekawości i ewentualnie prostota i skuteczność, brzmi: czy prosty bajt -for-byte strcmp (lub g_strcmp) faktycznie wykonuje tę samą pracę? Myślę, że powinien on, ponieważ UTF-8 encodes najpierw najbardziej znaczące bity, a punkt kodowy, który wymaga kodowania w bajtach N + 1, będzie miał większy początkowy bajt niż punkt kodowy, który musi być zakodowany w N bajtów.

Ale może czegoś brakuje? Z góry dziękuję.

Odpowiedz

7

Tak, kodowanie UTF-8 zachowuje kolejność kodów, więc można po prostu użyć strcmp. To jeden z wielu (wielu) pięknych punktów UTF-8.

Jedno zastrzeżenie jest to, że codepoints w Unicode są UTF-32 wartości, a niektórzy ludzie, którzy mówią o porównywania ciągów znaków Unicode w „punkt kodowy” porządku faktycznie używając słowa „punkt kodowy” nieprawidłowo oznaczać „UTF-16 jednostka kod ". Jeśli chcesz, aby zamówienie było zgodne z układaniem jednostek kodowych UTF-16, w grę wchodzi znacznie więcej pracy.

+0

Wielkie dzięki! Miałem zamiar podjąć dalsze kroki w mojej sprawie użycia i jak nie sądzę, że zastrzeżenie ma zastosowanie, a następnie zobaczyłem, że ta informacja jest właśnie w [standardzie] (http://www.w3.org/TR/xml- c14n # DocumentOrder) Próbuję zaimplementować: "Porównanie Leksykograficzne, które zamienia łańcuchy od najmniejszego do największego alfabetycznie, opiera się na wartościach kodów współrzędnych UCS, co jest odpowiednikiem uporządkowania leksykograficznego opartego na UTF-8." ':-)' – skagedal

Powiązane problemy