2012-06-14 17 views
20

QStringではstd :: stringよりもどのようなメリットがありますか?通常のstd :: stringはUnicode文字を格納できますか?私は様々な曲ファイルを開くプログラムを書こうとしています。これらのファイルの名前は、異なる言語にすることができます。私はこのような場合に通常の文字列を使うと正しく動作しないと聞いています。アプリケーションをQTから独立させ、アンドロイドなどでコードを再利用したいと考えています。何を指示してるんですか 。QString over std :: string

+4

http://www.joelonsoftware.com/articles/Unicode.html – Arafangion

+0

これはあなたの質問の一部にお答えするのに役立ちます。http://stackoverflow.com/questions/6028093/unicode-stdstring-class-replacement – kenny

+0

@Arafangionそれは楽しみの半分です...ファイルシステムエンコーディングに関するすべての混乱を画像に加えてください。 – 6502

答えて

23

QStringは、Unicodeを扱うことができ、より便利な方法があり、Qtとうまく統合できます。また、より良いパフォーマンスを持っています。cbamber85notedです。

std::stringは、あなたが与えたバイト数だけを格納します。エンコードについては何も知らないのです。 1文字あたり1バイトを使用しますが、世界のすべての言語では十分ではありません。あなたのテキストを保存する最良の方法は、おそらくUTF-8エンコーディングで、文字数が異なるバイト数を取ることができ、std::stringはそれを正しく処理できません。これは、たとえば、lengthメソッドが文字ではなくバイト数を返すことを意味します。そして、これは...

+0

私はQTのものを避けるために探しています、他の方法はありますか? –

+0

公平であるためには、std :: stringはUnicodeを使用することもできますが、それはデータが特定のエンコーディングであることを意味するものではありません。 QStringがユニコードの変換を可能にするということですか? – Arafangion

+10

Vihaan、あなたがQtのものを避けようとしているのなら、なぜそれを使用していますか? Qtコンポーネントとのインターフェースが必要な場合は、QStringを使用することで、より簡単に自分の人生を変えることができます。 – Joey

6

氷山の一角である私はQStringに慣れていないんだけど、std::string の大きな利点は、それ標準であるということです。 Unicodeに関しては、std::stringには がUTF-8を格納する問題はありません。 std::wstring(通常は はUTF-16またはUTF-32のいずれかを格納します)を使用する方がよい場合があります。

ユニコードの複雑な操作については、ICUをお勧めします。しかし、 のアプリケーションでは、UTF-8を格納するだけで十分です。

+0

'QString'は合理的な中間です。それは完全なICU機能を提供するわけではありませんが、UTF-8/16/32への変換のような簡単な処理を行うことができます。 – MSalters

+0

+1標準への固執は常に利点です。フレームワークの特殊な型をフレームワークの使用に保存します。私はちょうど不思議に思っていましたが、どのような利点は、UTF - 16またはUTF - 32の文字列は、ユニコードの場合は、std :: stringの対に与えるだろうか? – daramarak

+0

@daramarakこれは、コード内で文字列を使って何をやっているかによって異なります。 'std :: string'は実際には単純なコンテナではなく、含まれている_bytes_のいくつかを置き換えるためのいくつかの余分な機能を備えています。文字やエンコーディングに関する知識はなく、テキストに関連するものはほとんどありません。テキストを操作している場合、テキストを表すクラスが適切かもしれません。あるいは、 'std :: string'をUTF-8テキストとして扱うライブラリです。 –

4

技術的には、任意のタイプの文字(std::basic_string)を格納する標準の文字列クラスがあります。 std::stringstd::wstringは、charwcharの場合はstd::basic_stringの特殊化に過ぎません。 std::u16stringおよびstd::u32stringには、UTF-16およびUTF-32ストレージ用の特殊化もあります。

Qtを扱う必要がある場合は、QStringは、Qtフレームワーク全体がそれに対応するように設計されているため、おそらく常に標準ライブラリの文字列よりも優れた代替手段となります。

7

ソフトウェアの作成にQtフレームワークを使用している場合は、QStringを使用する方がよいでしょう。単純な理由は、文字列で動作するほとんど全てのQt関数がQStringを受け入れるということです。 std :: stringを使用すると、あるタイプから別のタイプへの型変換が必要な状況に終わることがあります。ソフトウェアがQtをまったく使用していない場合は、std :: stringの使用を検討する必要があります。これにより、コードをより移植性に富み、ユーザーがソフトウェアを使用するためにインストールする余分なフレームワークに依存しなくなります。

+3

フレームワークを使用することは、フレームワークライブラリをコード全体に浸透させる理由であってはなりません。 ui境界での変換は、ベンダーのロックを防ぐために支払う小さな値段です。 – daramarak

+3

@daramarakそうですが、Qtは単なるUIフレームワークではありません。それはまた、ネットワーク、SQL、XML、スクリプトなどのような非UIのもののすべての種類を提供します。どのように広範囲に1つは、フレームワークを使用しているに応じて、1つは電話をかけることができます。 – Pankaj