2011-12-27 9 views
3

文字列クラスがいくつかの異なる方法で実装されている理由と利点と欠点は何ですか?私はそれがいくつかの異なる方法を行ったと見てきました文字列クラスの実装の相違点

  1. 単純なchar(最も基本的な方法)を使用します。
  2. string<UTF8>のようなテンプレート文字列を使用してUTF8とUTF16をサポートしています。 UTF8charであり、UTF16unsigned shortである。
  3. 文字列クラスにUTF8とUTF16の両方を持つ。

他にも優れた文字列クラスを実装する方法はありますか?

+3

完全な文字列クラスはありません。パフォーマンス、リソース使用率、および普遍性は、相反する目標です。オペレーティングシステムとそのサポートライブラリで一般的なものを選んで、変換コードを書く時間を無駄にすることはありません。そして、あなた自身の文字列クラスを書くのではなく、既に十分です。 –

+0

文字列クラスがたくさんあることを知っています。私は学習の目的で文字列クラスを書くつもりです。確かに学習については異なる方法がありますが、私は自分自身を書くことを学ぶために費やす時間がありますが、これまでのところ違いはわかりません。 – mmurphy

+0

@mmurphy:「学習の目的で書きたいと思います」私にとっては、 "学習目的"のためにあいまいな仕事を選択するのではなく、 "実行することによって学ぶ"こと、自分が書きたい(楽しい)こと、書くこと(仕事)を書くことは、通常、より生産的です。あなたの脳はあなたが使っていないものや忘れてしまったものをすべて忘れてしまいます。もう一つの文字列コンテナを作ることは、まさにスリリングではありません。 – SigTerm

答えて

2

私が知る限りstd::basic_string<wchar_t>ここで、sizeof(wchar_t) == 2はUTF16エンコーディングではありません。ユニコードでは2^16以上の文字があり、コードは少なくとも0xFFFFF>0xFFFF(2バイトwchar_t容量)までです。結果として、適切なUTF16は、std::basic_stringと同様のクラスではなく、one string element == one characterと仮定した場合、1文字あたり可変バイト数(1つの2バイトのwchar_tまたはその2つ)を使用する必要があります。

私が知る限り、ユニコード文字列を扱うには2つの方法があります。

  1. は、あなたが「恩恵」を楽しむことができるようになりますので、(基本的には、簡単な文字列(例えば、Linux上でsizeof(wchar_t) == 4を見て非常に正常である)単一の文字列要素に任意の文字に合わせて十分に大きいタイプを使用しますか長さの計算と他の何も)std::stringのようなクラス。
  2. 可変長エンコード(1文字あたりUTF8-1.4バイトまたはUTF16-2.4バイト)と、文字列操作ルーチンを提供するよくテストされた文字列クラスを使用します。

charを使用しない限り、どの方法を使用しても問題ありません。 charベースの文字列は、8ビットコードページが異なるマシンでは問題が発生する可能性があります。注意する必要がない場合は注意してください(忘れてしまい、 Applocaleは理由のために作成されました)。

ユニコードには印刷可能な文字(制御コードとユニコード文字の書式設定文字)がたくさん含まれているため、#1のメリットが得られるメリットはほとんどありません。それにもかかわらず、方法#1を使用することに決めた場合、wchar_tはいくつかのコンパイラ/プラットフォーム(windows/microsoftコンパイラ)で可能なすべての文字を収めるのに十分ではなく、そのためstd::basic_string<wchar_t>は完璧な解決策ではありません。最高のアイデアは、ちょうどうまくいけば(つまり、適切に制御文字や双方向を扱うことができるテキストレイアウトエンジンが付属していることがあるユニコード互換どんな(QStringのような)文字列クラスつかむことであろうように、国際化テキストのレンダリング


は、痛みですより面白いプログラミング問題に集中することができます。


-Update-

符号なしshortがUTF16でない場合は、その後unsigned int型は何ですか? UTF8とは何ですか?それは無署名のcharですか?

UTF16可変長文字エンコーディングあります。 UTF16は、1文字あたり2バイト(すなわち、uint16_t,16ビット)の要素を使用します。私。 UTF16文字列内の要素の数!= UTF16の文字列中の文字数。要素を数えて文字列の長さを計算することはできません。

UTF8(8ビット、1バイトまたは "unsigned char型")1バイトの要素に基づいて、別の可変長符号化です。 UTF8の1つのユニコード文字(「コードポイント」)は、1 .. uint8_tの要素をとります。もう一度、stringの要素の数!= stringの文字の数。 UTF8の利点は、ASCII内に存在する文字は、UTF8で文字ごとに正確に1バイトを取るため、少しのスペースが節約されますが、UTF16では文字が常に少なくとも2バイト必要です。

UTF32は常にキャラクタ当たり32ビット(4バイトまたはuint32_t)を使用すること、固定長文字エンコーディングあります。現在のところ、ユニコード文字は単一のUTF32要素に収まることがあり、UTF32はおそらく長時間固定長になります(私は、地球のすべての言語が2^31の異なる文字を生成するとは思わない)。それはより多くのメモリを浪費しますが、文字列中の要素の数==文字列中の文字数です。

また、C++標準では、「int」または「short」の大きさを指定していないことに注意してください。

+0

unsigned shortがUTF16でない場合は、unsigned intとは何ですか? UTF8とは何ですか?それは無署名のcharですか? – mmurphy

+0

@ mmurphy:答えは – SigTerm

+0

に更新されました。ありがとうございました。 – mmurphy