21

文字列をチェックする必要がある文字範囲制限のリストがありcharますが、.NET の型は UTF-16 であるため、一部の文字は奇抜な (サロゲート) ペアになります。charしたがって、内のすべての を列挙するstringと、32 ビットの Unicode コード ポイントが取得されず、高い値との比較が失敗する場合があります。

必要に応じて自分でバイトを解析できるほど Unicode を十分に理解していますが、C#/.NET Framework BCL ソリューションを探しています。そう ...

a を32 ビット Unicode コード ポイントstringの配列 ( ) に変換するにはどうすればよいですか?int[]

4

5 に答える 5

7

この答えは正しくありません。正しいものについては、@Virtlink の回答を参照してください。

static int[] ExtractScalars(string s)
{
  if (!s.IsNormalized())
  {
    s = s.Normalize();
  }

  List<int> chars = new List<int>((s.Length * 3) / 2);

  var ee = StringInfo.GetTextElementEnumerator(s);

  while (ee.MoveNext())
  {
    string e = ee.GetTextElement();
    chars.Add(char.ConvertToUtf32(e, 0));
  }

  return chars.ToArray();
}

: 合成文字を扱うには、正規化が必要です。

于 2009-03-26T20:28:10.787 に答える
0

Nicholas (および Jeppe) によって提案されたのと同じアプローチを思いつきました。

    public static IEnumerable<int> GetCodePoints(this string s) {
        var utf32 = new UTF32Encoding(!BitConverter.IsLittleEndian, false, true);
        var bytes = utf32.GetBytes(s);
        return Enumerable.Range(0, bytes.Length / 4).Select(i => BitConverter.ToInt32(bytes, i * 4));
    }

必要なのは列挙だけでしたが、配列を取得するのは簡単です。

int[] codePoints = myString.GetCodePoints().ToArray();
于 2016-07-19T14:10:27.377 に答える