我想知道在 .NET 2.0 中是否有一种方法可以检查一个字符是否可打印 - 就像标准 C 中的 isprint(int)
函数。
我找到了Char.IsControl(Char)
。
这个函数可以用于这个目的吗?
我想知道在 .NET 2.0 中是否有一种方法可以检查一个字符是否可打印 - 就像标准 C 中的 isprint(int)
函数。
我找到了Char.IsControl(Char)
。
这个函数可以用于这个目的吗?
您可能需要使用Char.IsControl(Char)
,这就是我正在使用的方法。绝对不要使用<0x20
的方法,因为任何非拉丁文字符和大多数非英语字符都将高于127。
0x2028
和 0x2029
。尽管它们没有被分类为控制字符,但许多系统也认为它们是不可打印的。这些字符可以分别通过 UnicodeCategory.LineSeparator
和 UnicodeCategory.ParagraphSeparator
进行过滤。 - MattDavey // Sample input char.
char c = (char)0x20; // space
var isPrintable = ! Char.IsControl(c) || Char.IsWhiteSpace(c);
所有 Unicode 字符的 近似解决方案:Char
的测试的一个根本限制是,类型 Char
只能表示编码点为 U+FFFF
或更低的字符,即仅限基本多文种平面(BMP)中的字符。高于 BMP 的字符 - 具有更高编码点的字符 - 必须表示为 两个 Char
实例(称为代理对)。UnicodeCategory.PrivateUse
字符类别不是标准化的,正如名称所示,在 macOS 上,U+F8FF
包含了 Apple 符号,而在 Windows 上它未定义。因此,它可能包含可打印的字符,需要动态确定它们是否可打印。UnicodeCategory.Format
类别主要包含非渲染字符,但也有例外情况 - 参见此表。UnicodeCategory.PrivateUse
和 UnicodeCategory.Format
中的所有字符都是可打印的,这意味着至少有一些字符将被错误分类。using System;
using System.Linq;
using System.Globalization;
// ...
// Sample input char.
char c = (char)0x20; // space
// The set of Unicode character categories containing non-rendering,
// unknown, or incomplete characters.
// !! Unicode.Format and Unicode.PrivateUse can NOT be included in
// !! this set, because they may (private-use) or do (format)
// !! contain at least *some* rendering characters.
var nonRenderingCategories = new UnicodeCategory[] {
UnicodeCategory.Control,
UnicodeCategory.OtherNotAssigned,
UnicodeCategory.Surrogate };
// Char.IsWhiteSpace() includes the ASCII whitespace characters that
// are categorized as control characters. Any other character is
// printable, unless it falls into the non-rendering categories.
var isPrintable = Char.IsWhiteSpace(c) ||
! nonRenderingCategories.Contains(Char.GetUnicodeCategory(c));
Char.IsControl('\t') == false
。TIL,谢谢!(现在我不敢想象因为这个假设而无意中引入到世界上所有微妙的错误)。 - DaiChar.IsControlChar()
之外,还有几个函数可以用来确定给定的字符值属于哪个类别:
IsLetter()
IsNumber()
IsDigit()
IsLetterOrDigit()
IsSymbol()
IsPunctuation()
IsSeparator()
IsWhiteSpace()
(Char.IsLetterOrDigit(ch) || Char.IsPunctuation(ch) || Char.IsSymbol(ch) || (ch==' '))
应该可以工作。
现在,如果你正在使用Unicode,那么你会遇到麻烦。即使在过去,空格是否可打印是有争议的(因此有isprint()
和isgraph()
函数)。请参见与“可打印”Unicode字符相关的问题和答案。
private bool IsPrintableCharacter(char candidate)
{
return !(candidate < 0x20 || candidate > 127);
}