如何从string中去除非ASCII字符? (在C#中)
如何从string中去除非ASCII字符? (在C#中)
string s = "søme string"; s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
这是一个不使用正则expression式的纯.NET解决scheme:
string inputString = "Räksmörgås"; string asAscii = Encoding.ASCII.GetString( Encoding.Convert( Encoding.UTF8, Encoding.GetEncoding( Encoding.ASCII.EncodingName, new EncoderReplacementFallback(string.Empty), new DecoderExceptionFallback() ), Encoding.UTF8.GetBytes(inputString) ) );
它可能看起来很麻烦,但应该是直观的。 它使用.NET ASCII编码转换string。 在转换过程中使用UTF8,因为它可以表示任何原始字符。 它使用EncoderReplacementFallback将任何非ASCII字符转换为空string。
我相信MonsCamus的意思是:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
如果你不想去掉,但实际上把latin转换成非重音字符,看看这个问题: 如何将8bit字符转换成7bit字符? (即Ü到U)
受philcruz正则expression式解决scheme的启发,我制作了一个纯粹的LINQ解决scheme
public static string PureAscii(this string source, char nil = ' ') { var min = '\u0000'; var max = '\u007F'; return source.Select(c => c < min ? nil : c > max ? nil : c).ToText(); } public static string ToText(this IEnumerable<char> source) { var buffer = new StringBuilder(); foreach (var c in source) buffer.Append(c); return buffer.ToString(); }
这是未经testing的代码。
不需要正则expression式。 只是使用编码…
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
我发现以下稍微更改的范围对于从数据库中parsing注释块非常有用,这意味着您不必与导致CSV字段变得不适应的制表符和转义字符竞争。
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
如果你想避免其他特殊字符或特定的标点符号检查ascii表
这不是最佳的性能方面,而是一个非常直接的Linq方法:
string strippedString = new string( yourString.Where(c => c <= sbyte.MaxValue).ToArray() );
缺点是所有的“幸存”字符首先被放入一个char[]
types的数组中,然后在string
构造函数不再使用它时抛出。
我用这个正则expression式:
string s = "søme string"; Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0); return regex.Replace(s, "");
我来到这里寻找扩展ASCII字符的解决scheme,但无法find它。 我发现最近的是bzlm的解决scheme 。 但是,这只适用于ASCII码高达127(显然你可以replace他的代码中的编码types,但我认为这是有点复杂的理解,因此,共享这个版本)。 这是一个适用于扩展ASCII码的解决scheme,也就是ISO 8859-1的 255
它find并删除非ASCII字符(大于255)
Dim str1 as String= "â, ??î or ôu🕧 n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#" Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", New EncoderReplacementFallback(String.empty), New DecoderReplacementFallback()) Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1) Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes) console.WriteLine(str2) 'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:
这是一个代码工作的小提琴
根据需要replace编码,其余部分应保持不变。
我使用这个正则expression式来过滤掉文件名中的坏字符。
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
这应该是允许文件名的所有字符。