4

たとえば、C# コードでU+100000別の文字と比較したい6 桁の Unicode 文字があります。char

MSDNのドキュメントを読むと、この文字は で表すことができずchar、代わりに で表す必要がありstringます。

U+10000 から U+10FFFF の範囲の Unicode 文字は、文字リテラルでは許可されず、文字列リテラルでは Unicode サロゲート ペアを使用して表されます

明らかな何かが欠けているように感じますが、次の比較を正しく機能させるにはどうすればよいですか:

public bool IsCharLessThan(char myChar, string upperBound)
{
    return myChar < upperBound; // will not compile as a char is not comparable to a string
}

Assert.IsTrue(AnExample('\u0066', "\u100000"));
Assert.IsFalse(AnExample("\u100000", "\u100000")); // again won't compile as this is a string and not a char

編集

k、2 つのメソッドが必要だと思います。1 つは文字を受け入れる方法で、もう 1 つは「大きな文字」、つまり文字列を受け入れる方法です。そう:

public bool IsCharLessThan(char myChar, string upperBound)
{
    return true; // every char is less than a BigChar
}

public bool IsCharLessThan(string myBigChar, string upperBound)
{
    return string.Compare(myBigChar, upperBound) < 0;
}

Assert.IsTrue(AnExample('\u0066', "\u100000));
Assert.IsFalse(AnExample("\u100022", "\u100000"));
4

2 に答える 2

5

文字列リテラルを使用して Unicode コード ポイント U+10FFFF の文字列を作成するには、関連するサロゲート ペアを計算する必要があります。

この場合、次のものが必要です。

string bigCharacter = "\uDBFF\uDFFF";

または、次を使用できますchar.ConvertFromUtf32

string bigCharacter = char.ConvertFromUtf32(0x10FFFF);

メソッドで何を実現したいかは明確ではありませんが、BMP にない文字を処理する必要がある場合は、 のint代わりにchar, または. を受け入れるようにする必要がありますstring

のドキュメントに従って、string文字列内の文字を完全な Unicode 値として反復処理する場合は、TextElementEnumeratorまたはを使用しますStringInfo

これを明示的に行う必要があることに注意してください。序数値のみを使用すると、UTF-32 コード ポイントではなく、UTF -16コード単位がチェックされます。例えば:

string text = "\uF000";
string upperBound = "\uDBFF\uDFFF";
Console.WriteLine(string.Compare(text, upperBound, StringComparison.Ordinal));

これはゼロより大きい値を出力し、それがここtextよりも大きいことを示唆していupperBoundます。代わりに、次を使用する必要がありますchar.ConvertToUtf32

string text = "\uF000";
string upperBound = "\uDBFF\uDFFF";
int textUtf32 = char.ConvertToUtf32(text, 0);
int upperBoundUtf32 = char.ConvertToUtf32(upperBound, 0);
Console.WriteLine(textUtf32 < upperBoundUtf32); // True

したがって、それがおそらくメソッドで行う必要があることです。StringInfo.LengthInTextElements最初に、文字列が実際に単一の UTF-32 コード ポイントであることを確認するために使用したい場合があります。

于 2012-10-26T20:25:18.433 に答える
1

https://msdn.microsoft.com/library/aa664669.aspxから、\U完全な 8 桁の 16 進数で使用する必要があります。たとえば、次のようになります。

string str1 = "\U0001F300";
string str2 = "\uD83C\uDF00";
bool eq = str1 == str2;

:cyclone:絵文字を使用します。

于 2015-06-11T12:49:28.893 に答える