六位 unicode 转义值比较

Posted

技术标签:

【中文标题】六位 unicode 转义值比较【英文标题】:Six digit unicode escaped value comparison 【发布时间】:2012-10-17 02:51:33 【问题描述】:

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

我对@9​​87654321@ 的解读是,这个字符不能用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"));

【问题讨论】:

【参考方案1】:

要使用字符串文字构造带有 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 代码点。

【讨论】:

嗨乔恩。我想检查一个字符是否在自定义范围内。我通过检查范围的一端来简化示例。但是 \u10FFFF 不小于 \u10FFFF! @sprocketonline:是的,但您不能将U+10FFFF 指定为char。这就是我的观点。如果您需要考虑非 BMP 字符,您必须让您的方法接受这些字符。 但是\u10FFFF 是一个有点愚蠢的例子(因为\u10FFFF 是唯一一个不能与之比较的值)。因此,我将示例更改为希望更好的示例。 @sprocketonline:答案仍然是true,因为每个char 也小于U+100000。每个char 都在 U+0000 到 U+FFFF 的范围内。 非常好,乔恩!我已经编辑并清理了示例。【参考方案2】:

从 https://msdn.microsoft.com/library/aa664669.aspx 开始,您必须使用带有完整 8 个十六进制数字的 \U。比如:

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

使用:cyclone: 表情符号。

【讨论】:

以上是关于六位 unicode 转义值比较的主要内容,如果未能解决你的问题,请参考以下文章

Unicode 代码点转义语法

Python日志记录:unicode符号是unicode转义的[重复]

如何将 unicode 字符串转换为其 unicode 转义?

转义 iOS 的 Unicode 字符

取消转义字符串中的 unicode

js中Unicode转义序列