如何获取C#中所有可打印字符的列表?

时间:2009-05-20 11:22:45

标签: c#

我希望能够在C#中获取所有可打印字符的字符数组,是否有人知道如何执行此操作?

修改

可打印我的意思是可见的欧洲字符,所以是的,变音符号,波浪号,重音等等。

6 个答案:

答案 0 :(得分:27)

这将为您提供一个包含所有不被视为控制字符的字符的列表:

List<Char> printableChars = new List<char>();
for (int i = char.MinValue; i <= char.MaxValue; i++)
{
    char c = Convert.ToChar(i);
    if (!char.IsControl(c))
    {
        printableChars.Add(c);
    }
}

您可能需要调查其他Char.IsXxxx方法,以找到符合您要求的组合。

答案 1 :(得分:20)

这是Fredrik解决方案的LINQ版本。请注意,Enumerable.Range会产生IEnumerable<int>,因此您必须先转换为字符。我相信Cast<char>会在3.5SP0中发挥作用,但从3.5SP1开始,您必须进行“正确”的转换:

var chars = Enumerable.Range(0, char.MaxValue+1)
                      .Select(i => (char) i)
                      .Where(c => !char.IsControl(c))
                      .ToArray();

我已经将结果创建为一个数组,因为这就是问题所要求的 - 但它不一定是最好的主意。这取决于用例。

请注意,这也不考虑完整的Unicode字符,只考虑基本多语言平面中的字符。我不知道高/低代理人的回报是什么,但至少知道一个char并不能真正让你代表一切:(

答案 2 :(得分:4)

LINQ解决方案(基于FredrikMörk's):

Enumerable.Range(char.MinValue, char.MaxValue).Select(c => (char)c).Where(
    c => !char.IsControl(c)).ToArray();

答案 3 :(得分:0)

我知道ASCII并没有特别要求,但这是获取所有可打印ASCII字符列表的快捷方法。

for (Int32 i = 0x20; i <= 0x7e; i++)
{
    printableChars.Add(Convert.ToChar(i));
}

请参阅此ASCII table

答案 4 :(得分:0)

public bool IsPrintableASCII(char c)
{
     return c >= '\x20' && c <= '\x7e';
}

答案 5 :(得分:0)

TLDR 答案

使用这个正则表达式...

var regex = new Regex(@"[^\p{Cc}^\p{Cn}^\p{Cs}]");

TLDR 说明

  • ^\p{Cc}不要匹配控制字符。
  • ^\p{Cn}不要匹配未分配的字符。
  • ^\p{Cs}不要匹配 UTF-8 无效字符。

工作演示

我在这个演示中测试了两个字符串:"Hello, World!""Hello, World!" + (char)4char(4)END TRANSMISSION 的字符。

using System;
using System.Text.RegularExpressions;

public class Test {
    public static MatchCollection getPrintableChars(string haystack) {
        var regex = new Regex(@"[^\p{Cc}^\p{Cn}^\p{Cs}]");
        var matches = regex.Matches(haystack);
        return matches;
    }
    public static void Main() {
        var teststring1 = "Hello, World!";
        var teststring2 = "Hello, World!" + (char)4;
        
        var teststring1unprintablechars = getPrintableChars(teststring1);
        var teststring2unprintablechars = getPrintableChars(teststring2);
        
        Console.WriteLine("Testing a Printable String: " + teststring1unprintablechars.Count + " Printable Chars Detected");
        Console.WriteLine("Testing a String With 1-Unprintable Char: " + teststring2unprintablechars.Count + " Printable Chars Detected");
        
        foreach (Match unprintablechar in teststring1unprintablechars) {
            Console.WriteLine("String 1 Printable Char:" + unprintablechar);
        }
        
        foreach (Match unprintablechar in teststring2unprintablechars) {
            Console.WriteLine("String 2 Printable Char:" + unprintablechar);
        }
    }
}

Full Working Demo at IDEOne.com

替代方案

  • \P{C} :仅匹配可见字符。不匹配任何不可见字符。
  • \P{Cc} :仅匹配非控制字符。不匹配任何控制字符。
  • \P{Cc}\P{Cn} :仅匹配已分配的非控制字符。不匹配任何控制字符或未分配的字符。
  • \P{Cc}\P{Cn}\P{Cs} :仅匹配已分配且 UTF-8 有效的非控制字符。不匹配任何控制字符、未分配字符或 UTF-8 无效字符。
  • \P{Cc}\P{Cn}\P{Cs}\P{Cf} :仅匹配已分配且 UTF-8 有效的非控制、非格式化字符。不匹配任何控制、未分配、格式或 UTF-8 无效字符。

来源和说明

查看可用于在正则表达式中进行测试的 Unicode Character Properties。您应该能够在 Microsoft .NETJavaScriptPythonJavaPHPRubyPerl 中使用这些正则表达式、Golang 甚至 Adobe。了解 Unicode 字符类是非常可转移的知识,所以我推荐使用它!