0

私は独自の文字列クラスを作成しています (楽しみのために) が、少し問題が発生しました。クラスで ASCII 文字列と Unicode 文字列の両方を処理できるようにしたいと考えています。my クラスにを割り当てるconst wchar_t*と、Unicode のフラグが設定されます。を割り当てた場合const char*、Unicode フラグは設定されません

さらに、Unicode 文字を ASCII 文字列に追加しようとすると、Unicode であるまったく新しい文字列を作成するか、そのバッファを再割り当てしてすべてを Unicode に変換します (どちらを行うかはわかりません)。

とにかく、私の質問に: std::string のc_str関数に似たものが欲しいです。明らかに、const char*ASCII 文字列を返す関数とconst wchar_t*Unicode 文字列を返す関数の 2 つの異なる関数が必要です。

私の文字列がASCIIだとしましょう。関数を呼び出すとToAsciiString()、文字列の内部ストレージへのポインターが返されるだけです。これは、文字列 dtor が自動的に行うため、手動で解放する必要はありません。

しかし、Unicode の ASCII 文字列が必要な場合は、ToUnicodeString(). しかし、それは問題を引き起こします: ASCII 文字列を変換するために新しいバッファを割り当てる必要があります。それを行った場合、返されたポインターを手動で編集する必要があり、たとえばdelete[]std::string の単純さが損なわれます。c_str

どうすればこれを適切に行うことができるかわかりません。

4

2 に答える 2

2

クラス内に2つのバッファを維持できるはずだと思います。1 つだけの場合もありますが、両方の表現が必要な場合は、両方を割り当てる必要があります。

このアプローチにより、クラスの使用が簡単になります。私たちの時代には、ギガバイトの RAM があります。これは、大量のデータを処理する必要がない限り、このアプローチがばかげているように聞こえないことを意味します。

于 2012-10-10T02:29:48.293 に答える
1

クラスでASCII文字列とUnicode文字列の両方を処理できるようにしたいと思います。

これはすべて間違った問題に近づいています。文字列にASCII文字または場合によってはUnicode文字を含める場合、解決策は簡単です。UTF-8を格納します。

定義上、UTF-8文字列はASCII後の文字が含まれていない場合はASCIIです。したがって、誰かが127より大きいコードポイントを追加しない限り、文字列はASCIIです。前後に切り替える必要はありません。両方を同じバイト配列で処理します。

wchar_t*また、あなたは「Unicode」とchar*「ASCII」を意味する一般的なWindowsの概念の下にいるようです。彼らはそうではありません。Unicodeは、21ビットコードポイントの意味とそれらの関係を説明する標準です。21ビットのコードポイントは、さまざまなエンコーディングで保存できます。あなたの「Unicode」はおそらく「UTF-16」を意味します。

于 2012-10-10T04:25:57.730 に答える