2011-07-08 9 views
2

STLソート機能は、UTF-8文字を持つ名前のアルファベット順ソートをサポートしていますか?ドイツ語/フランス語の名前を教えてください。STLソートはUTF8をサポートしていますか?

+0

[Sorting UTF-8 strings?](http://stackoverflow.com/questions/4611302/sorting-utf-8-strings) –

答えて

8

これは、UTF-8文字をどのように保存するか、そしてどのようにあなたの比較文字がどのように見えるかによって異なります。 sort関数は、それがソートする要素に完全に無関心です。

しかし、「char配列に格納されたときに...」あなたはおそらく意味とchar sが与えられたUTF-8文字の代わりに、論理的な文字の個々のバイトを保存しますので、その後、答えはではありません。 sort関数は、イテレータによって区切られた要素をソートします。 sortは、それらが参照するイテレータ/要素がその中に含まれるデータを認識している場合にのみ機能します。これは、UTF-8をエンコードするcharの配列には当てはまりません。

正しい解決策は、UTF-8入力を適切な(正規化された)Unicodeコードポイントの配列に解析し、それらをソートしてUTF-8に変換することです。

+0

いいえ。今は明らかです。ありがとう! – Spottsworth

+0

私は実際にあなたの質問を誤読している可能性がありますので、他の回答が適用される可能性があります。また、あなたの質問の下のコメントに記載されている "おそらく関連する"質問を見てください。 –

+0

ソートアルゴリズムではなく文字列クラスのように聞こえるのは本当の問題です。データを正しく取得します。アルゴリズムはその後に来る。 'std :: string'は' char * 'です。これはKonradが述べているように。 wstringとQStringなどはこのタスクに適しています。 – spraff

1

C++ 0xのsupports UTF

これはSTLとは何の関係もありません。

+1

残念ながら、UTFリテラルのC++ 0xサポートは、このコンテキストではまったく役に立ちません。 –

1

私はあなたが標準テンプレートライブラリを参照していると仮定し、答えはいいえです。

標準ライブラリのどれもテキスト文字列型を持っていません。 charの配列がありますが、それはちょうどバイトのベクトルです。 std::stringがありますが、それは基本的にバイト列(または16ビットワードなど)です。エンコードはもちろん、文字の概念もありません。

2

適切な比較機能が必要です。あなたはおそらくICU - International Components for Unicodeに1つを見つけることができます。特にCollationを見てください。

+0

これは、UTF-8文字が2バイト以上にまたがることがあり、 'sort'はこれを認識せず、入力内の各' char'(= byte)を別個の項目とみなすので不十分です。 –

+0

@ Konrad、私はあなたのコメントを理解していません - 'ソート'はソートしているデータを解釈しようとしません、それは比較機能にその仕事を残します。あなたはあなた自身の答えでこう言った。「並べ替え機能は、それが並べ替える要素に完全に無関心です。 –

+0

OPは個々の*文字*を文字列に並べ替えたいと思って質問を誤読しているかもしれません。 –

関連する問題