2013-09-07 10 views
6

は、UTF-8のテキストを格納する文字列とwstringの両方を使用することが可能です。文字でのstd ::文字列とUTF-8エンコードされたUnicode

  • 、ASCII文字は1バイトを取り、いくつかの漢字はstr[3]は必ずしも第四文字を指していないことを意味しているなど3または4を取ります。 wchar_t同じことが、文字ごとに使用されるバイト数の最小量で

  • は常に(charのための代わりの1)2であり、3または4バイト幅の文字は2 wchar_tがかかります。

右でしょうか?

だから、string::find_first_of()string::compare()などを奇妙にコード化された文字列で使用したいのですが?それは働くでしょうか?文字列クラスは、文字が可変サイズであるという事実を処理しますか?または、ダミーのフィーチャーレスバイト配列としてのみ使用する必要があります。この場合は、むしろwchar_t[]バッファーを使用します。

std::stringがそれを処理しない場合、2番目の質問:str[3]が実際に3番目の文字を指し示すように、そのUTF-8エンコーディングを処理できる文字列クラスを提供するライブラリがあるかどうか(長さ1から4のバイト配列)?

+0

「str [3]」が4番目のコードポイントであっても、必ずしも4番目に認識される文字ではないことに注意してください。 – delnan

+1

@delnan _Ok申し訳ありません(私はwchar_t、Windows、UTF-16についてのサンプル記事を選んだところです)。編集が遅すぎたので、私はコメントを削除しました。ここでは、 "議論の余地のない"リンクがない部分があります。_ wchar_tのサイズは実装定義であると思うので、常に2バイトではありません。さらに(IIRC)Windowsは、UTF-8ではなくUTF-16のようなものを格納するためにWindowsを使用しています。 http://en.wikipedia.org/wiki/Wide_character –

答えて

5

あなたはユニコードについて話しています。 Unicodeは32ビットを使用して文字を表します。しかし、それはメモリを無駄にしているので、よりコンパクトなエンコーディングがあります。 UTF-8はそのようなエンコーディングの1つです。これは、バイト単位を使用していることを前提としており、Unicode文字を1バイト、2バイト、3バイトまたは4バイトにマップします。 UTF-16は単語を単位として使用し、Unicode文字を1または2ワード(2または4バイト)にマッピングするものです。 stringとwchar_tの両方でエンコードを使用できます。 UTF-8は英語のテキスト/数字に対してよりコンパクトになる傾向があります。

いくつかのものは関係なく、エンコーディングおよび使用されるタイプ(比較)の動作します。しかし、1文字を理解する必要のあるすべての機能が壊れてしまいます。つまり、5番目の文字は、常に配列の5番目のエントリではありません。それは特定の例で動作しているように見えるかもしれませんが、最終的には壊れます。 string :: compareは動作しますが、アルファベット順の取得は期待しません。それは言語に依存します。 string :: find_first_ofは一部では機能しますが、すべてではありません。長い文字列は長くても機能しますが、短い文字は文字の配置によって混乱し、バグを見つけるのは非常に困難です。

最善のことはあなたのためにそれを処理し、(あなたはどちらか一方を選択する強力な理由がない限り)の下にタイプを無視するライブラリを見つけることです。

+0

あなたの答えをありがとう。 – Virus721

+5

* Unicodeは32ビットを使用して文字を表します。* =>実際に文字と呼ぶものに依存します。 Unicodeはコードポイント(整数)とGraphemes(整数のシーケンス、一般にサイズ1)を定義し、人々は画面に表示されるビジュアルエンティティであるため「文字」を「書体」に関連付ける傾向があります。 –

+0

_Unicodeは32ビットを使用して文字を表します._ これは間違っています! Unicodeは文字を表すためにビット数を使用しません**。 Unicodeは純粋に抽象です。各文字に番号を割り当てます。そのキャラクターを表現するビット数を指定する必要はありません。エンコーディングは文字を表現するための "よりコンパクトな"方法ではなく、文字を表現する**方法です。 https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excusesを参照してください。/ – Len

-1

あなたがそれらのために正しいです:strが[3]、必ずしも唯一のダミー機能レスバイト配列としてそれらを使用して...第四文字を指していないことを意味
... ...

C++の文字列はASCII文字しか扱えません。これは、Unicode文字を扱うことができるJavaのStringとは異なります。あなたは、符号化結果文字列に漢字の(バイト)(charはCに/ C++は単なるバイトで)保存することができますが、これは、あなたがそれを処理するために、文字列関数を使用することはできませんので、ちょうど、アスキー文字としてバイトを扱う文字列として無意味です。
wstringが必要な場合があります。

明確にしなければならないものがあります。 UTF-8はUnicode文字のエンコード方法です(バイト形式からバイト形式への変換)。

+0

あなたの答えをありがとう。私が知りたいのは、UTF-8でエンコードされたテキストを使用しているときに、文字列クラスのメソッドがまだ動作するかどうかです。 – Virus721

+0

-1 'std :: string'は' char'sを格納します。しかし、これはASCIIに限定されているわけではなく、エンコーディングについては何も知らないという意味で、エンコーディングに使用することができます。 Javaの文字列はUTF-16配列なので、 'str [3]'は必ずしも4番目のコードポイントであるとは限りません。 – delnan

+0

@delnan私の答えを完全に辿った後、投票してください。私はこれを "あなたは文字列(C/C++ではcharは単なるバイト)にエンコード結果(バイト)を格納することができますが、これは文字列としては意味がないので、文字列関数を使うことはできません私は「C++の文字列はASCII文字しか扱えない」と言った。 "C++の文字列はASCII文字しか格納できません。" HANDLEはSTOREとは異なります。文字列関数は、単にバイトを格納するときに無意味になります。そのため、私はHANDLEを使いました。ありがとう。 – JackyZhu

関連する問題