代码之家  ›  专栏  ›  技术社区  ›  Phil Bennett

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

c#
  •  15
  • Phil Bennett  · 技术社区  · 16 年前

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

    我所说的“可打印”是指可见的欧洲字符,是的,有umlauts、tildes、accents等。

    5 回复  |  直到 16 年前
        1
  •  30
  •   Fredrik Mörk    16 年前

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

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

        2
  •  21
  •   Jon Skeet    16 年前

    这是弗雷德里克解决方案的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 并不是真的让你代表一切:(

        3
  •  4
  •   Noldorin    16 年前

    LINQ解决方案(基于Fredrik Mrk):

    Enumerable.Range(char.MinValue, char.MaxValue).Select(c => (char)c).Where(
        c => !char.IsControl(c)).ToArray();
    
        4
  •  0
  •   Michael Murphy    9 年前

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

    看到这个了吗 ASCII table

        5
  •  0
  •   Artem Y    8 年前
    public bool IsPrintableASCII(char c)
    {
         return c >= '\x20' && c <= '\x7e';
    }
    
        6
  •  0
  •   HoldOffHunger Lux    4 年前

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

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

    TLDR解释

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

    工作演示

    我在这个演示中测试了两个字符串: "Hello, World!" "Hello, World!" + (char)4 . char(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}
    • \P{Cc}\P{Cn}\P{Cs}\P{Cf} :仅匹配已分配且UTF-8有效的非控制、非格式字符。不匹配任何控件、未分配、格式或UTF-8无效字符。

    看一看 Unicode Character Properties 可用于在正则表达式中进行测试的。您应该能够在中使用这些正则表达式 Microsoft .NET , JavaScript , Python , Java , PHP Ruby , Perl , Golang Adobe . 了解Unicode字符类非常重要