【问题标题】:Six digit unicode escaped value comparison六位 unicode 转义值比较
【发布时间】:2023-03-15 19:31:01
【问题描述】:

我有一个六位 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"));

【问题讨论】:

    标签: c# unicode unicode-escapes


    【解决方案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: 表情符号。

    【讨论】:

      猜你喜欢
      • 2018-01-22
      • 2018-09-18
      • 2012-03-04
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多