我有一个六位数的Unicode字符,例如U+100000
我想提出与另一个比较char
在我的C#代码。
我在阅读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,我想我需要两个方法,一个接受字符和其他接受“大字符”,即字符串。 所以:
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"));
要使用字符串字面构建与Unicode代码点U + 10FFFF一个字符串,你需要制定出代理对参与其中。
在这种情况下,您需要:
string bigCharacter = "\uDBFF\uDFFF";
或者你可以使用char.ConvertFromUtf32
:
string bigCharacter = char.ConvertFromUtf32(0x10FFFF);
目前尚不清楚你希望你的方法来实现的,但如果你需要用它来不是在BMP文字工作,你需要使它接受int
而不是char
或string
。
按照该文件string
,如果你想字符遍历字符串中的作为完整的Unicode值,使用TextElementEnumerator
或StringInfo
。
请注意, 你需要明确地做到这一点。 如果你只是使用序号值,它会检查UTF-16代码单元,而不是UTF-32代码点。 例如:
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代码点第一。
从https://msdn.microsoft.com/library/aa664669.aspx ,你必须使用\U
满8个十六进制数字。 因此,例如:
string str1 = "\U0001F300";
string str2 = "\uD83C\uDF00";
bool eq = str1 == str2;
使用:旋风:表情符号。