六位数unicode逃逸价值比较

我有一个六位数的unicode字符,例如U+100000 ,我希望与我的C#代码中的另一个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,我想我需要两种方法,一种是接受字符,另一种是接受“大字符”即字符串。 所以:

 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而不是charstring

根据string的文档,如果要将字符串中的字符作为完整的Unicode值进行迭代,请使用TextElementEnumeratorStringInfo

请注意,您确实需要明确地执行此操作。 如果您只使用序数值,它将检查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位hex数字。 例如:

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

使用:旋风:表情符号。