【问题标题】:Check if a large number is a valid Unicode character检查一个大数字是否是一个有效的 Unicode 字符
【发布时间】:2020-03-18 14:05:31
【问题描述】:

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

【问题讨论】:

  • Char.IsSymbol(Convert.ToChar(340813)) 但是 340813 不是有效的 Unicode 字符。
  • 我试过了。我收到溢出错误。值太大(我使用的值是 340736)。

标签: c# unicode char


【解决方案1】:

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

要检查代码点是否是符号,您必须将代码点转换为字符串并调用IsSymbol(String, Int32) overload。要获取字符串,请使用Char.ConvertFromUtf32(Int32) “将指定的 Unicode 代码点转换为 UTF-16 编码的字符串。”

int codepoint = 340813;
string character = Char.ConvertFromUtf32(codepoint);
return IsSymbol(character, 0);

要检查一个代码点是否有效更容易,因为 Unicode 字符的最大值是 0x10FFFF。原因请阅读Why Unicode is restricted to 0x10FFFF?

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

bool isValidUnicodeCharacter = codepoint <= 0x10FFFF && 
                               (codepoint < 0xD800 || codepoint > 0xDFFF)

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

【讨论】:

  • 我不认为 OP 试图检查字符代码是否是符号(在该术语的 Unicode 含义中),而是试图确定字符代码是否是有效的 Unicode性格 - 虽然我当然可能是错的。
  • @MatthewWatson 我也这么认为,并写了一篇关于检查有效代码点的部分,然后在我重新阅读问题后发布之前将其删除
  • Char.ConvertFromUtf32(Int32) 如果是这种情况,也可以用于检查有效性,因此仍然比我建议的要好(但仍然会遇到同样的开销问题抛出异常)。
  • 无论如何这显然是一个更好的答案,所以我删除了我的。 :)
  • 大家好,谢谢大家的帮助。我已经尝试了建议的解决方案,但我得到了一个奇怪的结果。我正在尝试值为 21152 和字符串 ch = Char.ConvertFromUtf32(num); 的代码返回一个汉字,表示它是一个有效的 UNICODE 符号,但函数 Char.IsSymbol(ch, 0) 返回 false。
猜你喜欢
  • 1970-01-01
  • 2019-05-11
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多