【问题标题】:How do I get a list of all the printable characters in C#?如何获取 C# 中所有可打印字符的列表?
【发布时间】:2009-05-20 11:22:45
【问题描述】:

我希望能够得到一个包含 C# 中所有可打印字符的 char 数组,有人知道怎么做吗?

编辑:

我所说的可打印是指可见的欧洲字符,所以是的,变音符号、波浪线、重音符号等。

【问题讨论】:

  • 请定义“可打印” - 您的意思是“可打印的 ASCII 字符”(根据 ilivewithin 的回答)还是要包含重音字符?
  • 我假设通过打印我们谈论的是可打印在纸上?如果您只是在寻找 ascii 查找,asciitable.com 就是其中之一。对于 unicode,charmap.exe 是显而易见的选择。

标签: c#


【解决方案1】:

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

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 方法以找到适合您要求的组合。

【讨论】:

  • 出于我不明白的原因,如果你这样做:for (char c = char.MinValue; c
  • 看起来 c++ 语句使计数器在 65535 之后回绕为 0,这意味着 c
  • (我有时希望可以编辑 cmets 以便删除那些烦人的拼写错误......)
【解决方案2】:

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

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

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

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

【讨论】:

  • 我真的需要深入研究 Linq 的东西,那里有一些优雅的解决方案:o)
  • 该死,所以我击败了 Jon Skeet,但我的答案仍然失败。 :( 请注意:您可以将 Select 调用替换为 Cast 以使其稍微好一点。
  • 反对者,请给出理由。 (请注意,虽然这与诺多林的回答相似,但我相信它提供了更多信息 - 并且有效:)
  • Noldorin:您发布得更快,因为我花了一分钟来测试我的代码是否有效 :)
  • @Jon Skeet:好吧,如果我花点时间的话会更快,但是嗯。我想如果有投票可以争夺的话,这个网站上的合作真的是不可能的。 :P
【解决方案3】:

LINQ 解决方案(基于 Fredrik Mörk 的):

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

【讨论】:

  • 哎呀,那里需要演员表。干杯。
  • ...但我又一次意识到我没有运行 SP1。
  • 啊,很公平。不知道为什么设计师在 SP1 中做出了这样的改变......允许从 int 转换为 char 似乎是合乎逻辑的。
  • Eric Lippert 有一篇关于此的博客文章,但我目前找不到。基本上它从来没有打算支持这种转换。我同意这有点奇怪和烦人。
  • Range 的第二个参数是一个计数...这不意味着它应该是char.MaxValue - char.MinValue
【解决方案4】:

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

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

看到这个ASCII table

【讨论】:

    【解决方案5】:
    public bool IsPrintableASCII(char c)
    {
         return c >= '\x20' && c <= '\x7e';
    }
    

    【讨论】:

    • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
    【解决方案6】:

    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 .NETJavaScriptPythonJavaPHPRubyPerlGolang 甚至Adobe 中使用这些正则表达式。了解 Unicode 字符类是非常容易转移的知识,所以我推荐使用它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多