六位 unicode 转义值比较
Posted
技术标签:
【中文标题】六位 unicode 转义值比较【英文标题】:Six digit unicode escaped value comparison 【发布时间】:2012-10-17 02:51:33 【问题描述】:我有一个六位 unicode 字符,例如 U+100000
,我希望与我的 C# 代码中的另一个 char
进行比较。
我对@987654321@ 的解读是,这个字符不能用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 值进行迭代,请使用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 代码点。
【讨论】:
嗨乔恩。我想检查一个字符是否在自定义范围内。我通过检查范围的一端来简化示例。但是 \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 转义值比较的主要内容,如果未能解决你的问题,请参考以下文章
Python日志记录:unicode符号是unicode转义的[重复]