15

まさにそれ: 文字列の長さはバイトサイズと同じですか? それは言語に関係がありますか?

だと思いますが、確認したいだけです。

追加情報: 一般的に疑問に思っています。私の特定の状況は、MySQL を使用した PHP でした。

答えはノーなので、私が知る必要があるのはそれだけです。

4

6 に答える 6

49

いいえ。ゼロで終了する文字列には、余分なバイトが 1 つあります。パスカル文字列(Delphi ショートストリング)には、長さを表す余分なバイトがあります。また、Unicode 文字列は 1 文字あたり 1 バイトを超えています。

ユニコードでは、エンコーディングに依存します。1 文字あたり 2 または 4 バイト、または 1、2、4 バイトが混在している場合もあります。

于 2009-01-03T20:32:40.203 に答える
23

プラットフォームと表現に完全に依存します。

たとえば、.NET では、文字列はUTF-16 コード ポイントごとに 2 バイトのメモリを必要とします。ただし、サロゲート ペアでは、U+100000 から U+10FFFF の範囲の完全な Unicode 文字に対して 2 つの UTF-16 値が必要です。インメモリ形式には、文字列の長さと場合によってはパディングのオーバーヘッド、および型ポインタなどの通常のオブジェクト オーバーヘッドもあります。

現在、文字列を .NET からディスク (またはネットワークなど) に書き込むときは、エンコーディングを指定します (ほとんどのクラスはデフォルトで UTF-8 に設定されています)。その時点で、サイズはエンコーディングに大きく依存します。ASCII は常に 1 文字につき 1 バイトを使用しますが、非常に制限されています (アクセントがないなど)。UTF-8 は、可変エンコーディングを使用して完全な Unicode 範囲を提供します (すべての ASCII 文字は 1 バイトで表されますが、その他の文字はそれ以上を占めます)。UTF-32 は、Unicode 文字に対して常に正確に 4 バイトを使用します - リストは続きます。

ご覧のとおり、これは単純なトピックではありません。文字列が占めるスペースの量を計算するには、状況が何であるかを正確に指定する必要があります-それが特定のプラットフォームのメモリ内のオブジェクトであるかどうか (そして、そうであれば、どのプラットフォームか-実装と動作に至る可能性さえあります)システム設定)、またはテキスト ファイルなどの未加工のエンコード形式かどうか、その場合はどのエンコードを使用しているか。

于 2009-01-03T20:40:08.643 に答える
6

「長さ」が何を意味するかによって異なります。「文字数」を意味する場合、いいえ、多くの言語/エンコード方法は、1 文字あたり 1 バイト以上を使用します。

于 2009-01-03T20:32:51.310 に答える
3

常にではありませんが、エンコーディングに依存します。

于 2009-01-03T20:32:48.003 に答える
3

答えは 1 つではありません。言語と実装に依存します(一部の言語には複数の実装があることに注意してください!)

ゼロで終わる ASCII 文字列は、文字列の「内容」より少なくとも1 バイト多く占有します。(文字列の作成方法によっては、さらに割り当てられる場合があります。)

ゼロで終わらない文字列は、ディスクリプタ (または同様の構造) を使用して長さを記録するため、余分なメモリが必要になります

Unicode 文字列 (さまざまな言語) は、1 文字あたり 2 バイトを使用します。

オブジェクト ストア内の文字列は、メモリ管理を簡素化するために間接レイヤー (およびより多くのデータ) を追加するハンドルを介して参照できます。

于 2009-01-03T20:45:56.667 に答える
2

あなたは正しいです。ASCII としてエンコードすると、1 文字あたり 1 バイトになります。それ以外の場合は、1 文字あたり 1 バイト以上です。

特に、これが部分文字列操作にどのように影響するかを知ることは重要です。文字ごとに 1 バイトがない場合、s[n] は n 番目のバイトまたは n 番目の文字を取得しますか? n 番目の文字を取得することは、1 文字あたり 1 バイトであるため、定数ではなく大きな n に対しては非効率的です。

于 2009-01-03T20:47:00.143 に答える