检查大数是否是有效的 Unicode 字符

use*_*463 3 c# unicode char

我想检查一个大数字是否是有效的 Unicode 字符。我查看了该Char.IsSymbol(char)函数,但它需要一个字符作为输入。我需要的是相当于Char.IsSymbol(int). 例如:Char.IsSymbol(340813);

phu*_*clv 5

char是C#中的16位类型,表示UTF-16编码单元,因此它可以存储的最大值是65535,Char.IsSymbol(340813)不起作用。

要检查代码点是否是符号,您必须将代码点转换为字符串并调用IsSymbol(String, Int32)重载。要得到列使用Char.ConvertFromUtf32(Int32)其“指定的Unicode代码点成UTF-16编码转换为字符串。”

int codepoint = 340813;
string character = Char.ConvertFromUtf32(codepoint);
return IsSymbol(character, 0);
Run Code Online (Sandbox Code Playgroud)

要检查代码点是否有效甚至更容易,因为 Unicode 字符的最大值是 0x10FFFF。原因阅读为什么 Unicode 被限制为 0x10FFFF?

这意味着您只需要一个简单的,if (codepoint <= 0x10FFFF)尽管您可能需要排除代理范围 0xD800–0xDFFF,因为它不是单个字符的有效值。所以结果是

bool isValidUnicodeCharacter = codepoint <= 0x10FFFF && 
                               (codepoint < 0xD800 || codepoint > 0xDFFF)
Run Code Online (Sandbox Code Playgroud)

Char.ConvertFromUtf32();如果您的字符串包含大量无效字符,您可能需要在传递之前检查代码点是否有效以避免异常

  • 我不认为OP试图检查字符代码是否是一个符号(在该术语的Unicode含义中),而是试图确定字符代码是否是有效的Unicode字符 - 尽管我当然可以错误的。 (2认同)
  • 如果是这种情况,“Char.ConvertFromUtf32(Int32)”也可以用于检查有效性,因此仍然比我建议的要好(但仍然会遇到与异常开销相同的问题)抛出)。 (2认同)
  • 无论如何,这显然是一个更好的答案,所以我删除了我的答案。:) (2认同)