[解決済み] この文字列の長さは、なぜ文字数より長いのでしょうか?
質問
このコード
string a = "abc";
string b = "A????C";
Console.WriteLine("Length a = {0}", a.Length);
Console.WriteLine("Length b = {0}", b.Length);
を出力します。
Length a = 3
Length b = 4
なぜ?唯一想像できるのは、漢字が2バイトであることと
.Length
メソッドはバイト数を返します。
どのように解決するのですか?
誰もが表面的な答えを言っていますが、深い理由もあります。quot;文字数"は定義が難しい問題で、計算には驚くほどコストがかかりますが、長さのプロパティは高速であるべきです。
なぜ定義が難しいのか?それは、いくつかの選択肢があり、どれが一番有効ということがないからです。
-
コードユニット(バイトまたは他の固定サイズのデータチャンク。C#とWindowsは通常UTF-16を使用するので、2バイトの数を返す)の数は、コンピュータが多くの目的でその形式でデータを処理する必要があるため、確かに関連しています(例えば、ファイルへの書き込みは文字ではなくバイトを気にします)。
-
Unicode コードポイントの数はかなり簡単に計算でき(文字列をスキャンしてサロゲートペアを探す必要があるので O(n) ですが)、テキストエディタにとっては重要かもしれませんが、実は画面に印刷される文字の数(グラフェムといいます)とは同じものではありません。例えば、アクセントのある文字は、1つのコードポイントか、2つのポイントが対になっており、1つはその文字を表し、もう1つは "私のパートナーの文字にアクセントを加えてください"というものです。このペアは2文字でしょうか、それとも1文字でしょうか?文字列を正規化することでこの問題を解決できますが、すべての有効な文字が単一のコードポイント表現を持つわけではありません。
-
また、文字によっては多くのフォントで重なり合って印刷されるため(カーニング)、画面上の文字列の長さは必ずしも字母の長さの合計と同じではありません。
-
Unicodeポイントの中には、伝統的な意味での文字ではなく、ある種の制御マーカーであるものもあります。バイトオーダーマーカーや右から左へのインジケーターのようなものです。これらはカウントされるのでしょうか?
要するに、文字列の長さは実はとんでもなく複雑な問題で、計算するにはデータテーブルだけでなく、CPUの時間もかなりかかるのです。
さらに、何が言いたいのか?なぜこれらの測定基準が重要なのか?それは、あなたのケースで答えられるのはあなただけですが、個人的には、一般的には関係ないと思っています。データ入力の制限は、転送または保存する必要があるものなので、バイト制限によってより論理的に行われると私は考えています。表示サイズの制限は、表示側のソフトウェアで行うのがよいでしょう。メッセージのピクセル数が100であれば、何文字入るかはフォントなどに依存し、データレイヤーのソフトウェアではわからないのです。最後に、unicode標準の複雑さを考えると、他の方法を試すと、エッジケースでバグが発生する可能性があります。
ですから、あまり汎用的な使い方はできない難しい問題です。コードユニット数は計算が簡単で、基礎となるデータ配列の長さであり、一般的なルールとして最も意味があり有用で、定義も単純である。
そのため
b
は長さがあります
4
ドキュメントにそう書いてあるから」という表面的な説明を超えて。
関連
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み] 文字列リテラルの前にある'b'文字は何を意味するのでしょうか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] JavaScriptにおけるendsWith
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#で四捨五入する方法
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】C#:文字列の最初の文字を取得する方法は?