我希望能够在C#中获取所有可打印字符的字符数组,是否有人知道如何执行此操作?
修改
可打印我的意思是可见的欧洲字符,所以是的,变音符号,波浪号,重音等等。
答案 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)
使用这个正则表达式...
var regex = new Regex(@"[^\p{Cc}^\p{Cn}^\p{Cs}]");
^\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}
:仅匹配已分配且 UTF-8 有效的非控制字符。不匹配任何控制字符、未分配字符或 UTF-8 无效字符。\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 字符类是非常可转移的知识,所以我推荐使用它!