他のプログラミング言語の1バイトとは異なり、C#(.NET)では2バイトサイズのchar
タイプがあるのはなぜですか。
CharはC#のユニコードであるため、可能な文字数は255を超えます。したがって、2バイトが必要になります。
拡張ASCIIたとえば、255文字のセットがあるため、1バイトに格納できます。これは、System.Encoding
名前空間の目的でもあります。システムによって異なる場合があるためです。文字セット、および文字サイズC#は1/4などの文字バイトを処理できますが、Unicode UTF-16がデフォルトです。
「その他のプログラミング言語」と推測していますが、これはCを意味します。Cには実際にはchar
タイプが2つあります:char
とwchar_t
。 char
は1バイトの長さ、wchar_t
必ずしも。
C#(および.NET)では、すべての文字列はUTF-16でUnicodeとしてエンコードされます。 .NETのchar
が単一のUTF-16 コード単位を表すのはそのためですコードポイントまたはサロゲートペアの半分(実際には文字、その後)。
実際、C#、より正確にはCLRのcharのサイズは、他のほとんどのマネージ言語と一致しています。 Javaのような管理された言語は、新しくなる傾向があり、Unicodeサポートのようなアイテムが最初から組み込まれています。ユニコード文字列をサポートする自然な拡張は、ユニコード文字を持つことです。
C/C++のような古い言語はASCIIのみで始まり、後になって初めてUnicodeサポートが追加されました。
C#文字列の文字のデフォルトは、UnicodeのUTF-16エンコーディングであり、これは2バイトです(デフォルト)。
16ビットの文字幅を使用するC#は、おそらく他の何よりもパフォーマンスと関係があります。
まず、UTF-8を使用する場合、「適切な」量のスペースにすべての文字を収めることができます。これは、UTF-8が可変幅であるためです。 ASCII文字は8ビットを使用しますが、大きな文字は8ビットを使用します。
しかし、可変長文字エンコーディングは、一般的なシナリオでO(n)アルゴリズムの複雑さを助長します。例えば。文字列内の特定の場所にある文字を取得します。この点については、公開討論が行われています。しかし、最も簡単な解決策は、ほとんどの文字セットに適合する文字幅を使い続け、他の文字を切り捨てることです。これで文字幅が固定されました。
厳密に言えば、UTF-16も可変幅エンコーディングであるため、C#(およびJavaそのことについては))は文字幅が32ビットになることはないため、ハイブリッドのようなものを使用しています。
.NETの文字列は2バイトのUnicode文字としてエンコードされているためです。