次の文字列があります。
友又
対応する UTF-16 表現 (リトルエンディアン) は次のとおりです。
CB 53 40 D8 87 DC C8 53
\___/ \_________/ \___/
友 又
"友又".Length
文字列は CLR によって 4 つの 2 バイト文字として格納されるため、4 を返します。
紐の長さはどうやって測るの?に分割するにはどうすればよい{ "友", "", "又" }
ですか?
次の文字列があります。
友又
対応する UTF-16 表現 (リトルエンディアン) は次のとおりです。
CB 53 40 D8 87 DC C8 53
\___/ \_________/ \___/
友 又
"友又".Length
文字列は CLR によって 4 つの 2 バイト文字として格納されるため、4 を返します。
紐の長さはどうやって測るの?に分割するにはどうすればよい{ "友", "", "又" }
ですか?
文書化されているように:
この
Length
プロパティは、Char
Unicode 文字の数ではなく、このインスタンス内のオブジェクトの数を返します。その理由は、Unicode 文字が複数の で表される可能性があるためですChar
。このクラスを使用してSystem.Globalization.StringInfo
、各 Char ではなく各 Unicode 文字を操作します。
長さの取得:
new System.Globalization.StringInfo("友又").LengthInTextElements
各 Unicode 文字の取得については、こちらに記載されていますが、拡張メソッドを作成する方がはるかに便利です。
public static IEnumerable<string> TextElements(this string s) {
var en = System.Globalization.StringInfo.GetTextElementEnumerator(s);
while (en.MoveNext())
{
yield return en.GetTextElement();
}
}
foreach
または LINQ ステートメントで使用します。
foreach (string segment in "友又".TextElements())
{
Console.WriteLine(segment);
}
長さにも使用できます。
Console.WriteLine("友又".TextElements().Count());