六位数unicode转义价值比较

时间:2012-10-26 20:07:21

标签: c# unicode unicode-escapes

我有一个六位数的unicode字符,例如U+100000,我想在C#代码中与另一个char进行比较。

我对MSDN documentation的解读是,此字符无法由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"));

2 个答案:

答案 0 :(得分:3)

要使用字符串文字构造Unicode代码点U + 10FFFF的字符串,您需要计算出所涉及的surrogate pair

在这种情况下,您需要:

string bigCharacter = "\uDBFF\uDFFF";

或者您可以使用char.ConvertFromUtf32

string bigCharacter = char.ConvertFromUtf32(0x10FFFF);

目前还不清楚您希望自己的方法实现什么目标,但如果您需要使用它来处理不在BMP中的字符,则需要让它接受int而不是char,或者string

根据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代码点。

答案 1 :(得分:0)

https://msdn.microsoft.com/library/aa664669.aspx开始,您必须使用\U,其中包含完整的8位十六进制数字。例如:

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

使用:cyclone:表情符号。