2013-08-20 21 views
7

Cプログラムでは、有効なUTF-8エンコード文字列のリストをUnicodeコードポイント順にソートする必要があります。照合なし、ロケール認識なし。strcmpはコードポイント順でutf-8文字列を比較しますか?

だから私は比較機能が必要です。ユニコード文字を反復する関数を書くのは簡単です。 (私はGLibを使用することが起こるので、私はg_utf8_next_charで反復し、g_utf8_next_charの戻り値を比較したい)

しかし、私は思ったんだけど、好奇心、おそらくシンプルさと効率性の外に、ある単純なバイトは意志-for-byte strcmp(またはg_strcmp)は実際に同じ仕事をしていますか? UTF-8 encodesの最上位ビットが最初であり、N + 1バイトでエンコーディングが必要なコードポイントは、Nバイトでエンコードされる必要があるコードポイントよりも大きな初期バイトを持つため、これを行うべきだと考えています。

しかし、多分私は何かを欠いている?前もって感謝します。

答えて

7

はい、UTF-8はコードポイントの順序を保持していますので、strcmpを使用することができます。それはUTF-8の(多くの)美しい点の1つです。

1つの警告は、UnicodeでコードポイントはUTF-32値であり、「コードポイント」ために、Unicode文字列を照合について話す何人かの人々が実際に「コードポイントは、」誤っUTF-16コード単位」を意味する単語を使用していることです"オーダーをUTF-16コードユニットの照合に一致させるには、多少の作業が必要です。

+0

ありがとうございます!私は、私のユースケースをフォローアップしようとしていましたが、警告が当てはまるとは思わないし、この情報が[標準](http://www.w3.org/TR/xml- c14n#DocumentOrder)私は実装しようとしています: "アルファベット順に文字列を並べ替えるレキシカル比較は、UTF-8に基づく辞書順に相当するUCSコードポイント値に基づいています。 ':-)' – skagedal