如何在.NET中检测不可打印的字符?

时间:2010-07-15 07:11:16

标签: c# .net vb.net

我只是想知道.NET 2.0中是否有一种检查字符是否可打印的方法 - 类似于标准C中的isprint(int)

我找到了Char.IsControl(Char)

这可以用于此目的吗?

4 个答案:

答案 0 :(得分:35)

您可能想要使用Char.IsControl(Char)。这就是我正在使用的。你绝对不想使用<0x20方法,因为任何非拉丁字符和大多数非英文字符都将超过127。

答案 1 :(得分:6)

如果通过打印表示呈现某些内容 - 即使该内容是空格(空白), [否定] {仅{1}} 足以确定某个字符是否可打印

  • 即使在单字节Char.IsControl() - U+0000 Unicode范围内(与ASCII / ISO-8859-1兼容)也不够,因为ASCII空格空格字符以外的字符也被归类为控制字符,因此U+00FFChar.IsControl('\t')也会报告为真。

  • 除了单字节范围外,还必须识别其他类别的非渲染字符。

单字节Char.IsControl('\n') - U+0000 Unicode范围的解决方案(与ASCII / ISO-8859-1兼容)

U+00FF

所有 Unicode字符的解决方案的 近似

可悲的是,没有简单的解决方案是完整的:

  • 基于 // Sample input char. char c = (char)0x20; // space var isPrintable = ! Char.IsControl(c) || Char.IsWhiteSpace(c); 的测试的一个基本限制是类型Char只能表示代码点Char之前的字符,即只能代表所谓的字符BMP(基本多语言平面)。 BMP之外的字符 - 具有更高的代码点 - 必须表示为两个 U+FFFF个实例(所谓的代理对)。

  • 顾名思义,Char字符类别未标准化;例如,macOS上的UnicodeCategory.PrivateUse包含Apple符号,而在Windows上未定义。因此可能包含可打印字符,您必须动态确定它们是否可打印。

  • U+F8FF类别主要是包含非呈现字符,但也有例外 - 请参阅this table

    • 您可以为给定版本的Unicode标准对这些异常进行硬编码,但这很麻烦,并且可能会随着时间的推移而过时。

因此,以下代码假定UnicodeCategory.FormatUnicodeCategory.PrivateUse中的所有字符都是可打印的,这意味着至少有些字符会被错误分类。

UnicodeCategory.Format

答案 2 :(得分:1)

除了 Char.IsControlChar() ,还有其他一些函数可用于确定给定char值是什么类别:

  • IsLetter()
  • IsNumber()
  • IsDigit()
  • IsLetterOrDigit()
  • IsSymbol()
  • IsPunctuation()
  • IsSeparator()
  • IsWhiteSpace()

如果拥有的是“传统ASCII文本”文件,并且要使用提供的功能,则表达式:

(Char.IsLetterOrDigit(ch) || Char.IsPunctuation(ch) || Char.IsSymbol(ch) || (ch==' '))

应该工作。

现在,如果您正在使用Unicode,则将打开罐头或蠕虫。甚至在白天,是否可以打印空间还是有待解释的(因此 isprint() isgraph()函数)。参见this related question and answers about "printable" unicode characters

答案 3 :(得分:-9)

private bool IsPrintableCharacter(char candidate)
{
    return !(candidate < 0x20 || candidate > 127);
}