【问题标题】:Detect non-displayable characters in string C#检测字符串 C# 中的不可显示字符
【发布时间】:2021-11-21 08:15:43
【问题描述】:

希望有人能帮我解决这个问题,因为到目前为止我还没有在网上找到任何解决方案。

我正在处理带有特殊字符的字符串,我想检测字符串中的任何字符是否无法通过例如网络浏览器甚至 Visual Studio 本身正确显示。以下字符串显示了此类字符。这来自 VS2019 中的 Text vizualizer:

TargetsforReduceCO

我检查了类似的问题,但答案大多仅限于检查字符代码是否超过 255。但是,仍然可以显示很多字符,例如希腊和西里尔符号。

我还找到了this 网站,该网站概述了所有 Unicode 字符并显示了它们在浏览器中的显示方式,但似乎没有任何逻辑无法显示字符及其字符代码.

我可以想象VS不知道哪些字符不能在各种浏览器中显示,但我希望至少有一种方法可以检查VS是否可以显示它们。

提前感谢您的帮助!

编辑:

我现在正在使用

input.Any(c => !char.IsLetterOrDigit(c) && c > 255);

因为输入通常不应包含除了您通常在文本中可以找到的符号之外的其他符号,但我确信它会在实际可以由 VS 或网络浏览器显示的符号上触发。

【问题讨论】:

  • 您提到的问题不相关 - 255 是单字节代码页的限制,而不是 Unicode 或 UTF8。您确定您没有使用错误的代码页读取这些字符吗?那根弦是从哪里来的?看起来整个单词都在那个字符串中丢失了。
  • 您必须非常清楚“无法显示”的含义。您显示的示例包含私人使用区域中的字符,但您是否还想计算操作系统中安装的任何字体都不支持的字符,或者宽度为 0 的字符(例如 RTL 标记,ZWJ) ? IMO,这些都是“不能显示”的合理定义。
  • 无法显示我的意思是它们显示为带有问号的框/矩形。该字符串来自一些尝试将自定义设计的字体转换为字符串的开源软件。它并不总是有效,因为设计师非常有创意:)。在这些情况下,它会将其转换为奇怪的字符。
  • 注:带数字的方框是一种显示字符,按字体处理。字体处理的字符看起来非常复杂(各种表格和整形器可能会将字符组合成一个字形。简而言之:如果您不愿意与显示引擎交谈(并且您知道安装的字体),这几乎是不可能的.但是,与其删除它,为什么会有这样的字符?也许你应该从那里开始
  • @GiacomoCatenazzi:我愿意做任何可能的事情,包括与显示引擎交谈,如果我知道的话:)。现在,删除这些字符超出了我的范围。我只是在处理别人给我的东西。我想警告他们,他们插入带有这些字符的字符串,以便他们可以删除它们。

标签: c# unicode visual-studio-2019


【解决方案1】:

类型char 有许多静态成员方法,例如IsPunctuation(),它们应该可以帮助您逐个字符地“分类”。请参阅此页面上的示例System.Char reference。这些方法的每一个文档都解释了它适用于哪些字符。正如评论者所提到的,您的“可显示”标准更多的是字体表示问题而不是字符值问题,但您将能够使用这些方法缩小系统可以使用的范围。留意其他方法,例如GetUnicodeCategory()

可能像!char.IsControl(c) 这样简单的东西就可以解决问题。

在此处查看类似的问答C# Printable Characters

【讨论】:

  • 感谢您的见解!我检查了 GetUnicodeCategory 的不同类别,某些类别仍然可能包含某些浏览器无法显示的字符。但是,检查 PrivateUse 类别至少是有意义的,我猜它始终是自定义符号,并且是我在所有示例中找到的唯一类别。所以,不是 100% 的我想要的,但我想是目前最好的选择。
猜你喜欢
  • 2013-05-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多