如何从字符串中删除非ASCII字符?(在C#中)

phi*_*ruz 215 c# ascii

如何从字符串中删除非ASCII字符?(在C#中)

phi*_*ruz 400

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Run Code Online (Sandbox Code Playgroud)

  • @Metro Smurf ^是非运算符.它告诉正则表达式找到所有不匹配的东西,而不是匹配的所有东西.\ u #### - \u ####表示哪些字符匹配.\ u0000-\u007F是utf-8或unicode中前255个字符的等值,它们始终是ascii字符.所以你匹配每个非ascii字符(因为not)并对匹配的所有内容进行替换. (45认同)
  • 可打印字符的范围是0020-007E,适用于寻找正则表达式来替换不可打印字符的人 (40认同)
  • 对于我们这些RegEx的挑战者,您是否介意用简单的英语写出您的RegEx模式.换句话说,"^这样做"等等...... (17认同)
  • @GordonTucker \u0000-\u007F 相当于 utf-8 或 unicode 中的**前 127 个字符**,而不是前 225 个。请参阅[表](http://www.ascii-code.com/) (4认同)
  • @full_prog_full这就是为什么我在一分钟之后回复自己,纠正自己说它是127而不是255. :) (4认同)

bzl*_*zlm 120

这是一个不使用正则表达式的纯.NET解决方案:

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)
    )
);
Run Code Online (Sandbox Code Playgroud)

它可能看起来很麻烦,但它应该是直观的.它使用.NET ASCII编码转换字符串.转换期间使用UTF8,因为它可以表示任何原始字符.它使用EncoderReplacementFallback将任何非ASCII字符转换为空字符串.

  • 你真的觉得它更容易理解吗?对我而言,所有与之无关的东西(后备,转换为字节等)都会引起人们对实际情况的注意. (21认同)
  • 这有点像说螺丝刀太混乱所以我只会用锤子代替. (21认同)
  • 一个优点是我可以轻松地用ISO 8859-1或其他编码替换ASCII :) (10认同)
  • @Brandon,实际上,这项技术并不比其他技术更好.因此,类比将使用普通的旧螺丝刀而不是花哨的iScrewDriver Deluxe 2000. :) (8认同)
  • 完善!在将字符串保存到RTF文档之前,我使用它来清理字符串.非常感谢.比Regex版本更容易理解. (5认同)

小智 36

我相信MonsCamus意味着:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这个答案比公认的答案要好,因为它去掉了控制字符。 (5认同)

sin*_*law 14

如果你不想剥离,但实际上将拉丁语重音转换为非重音字符,请看一下这个问题:如何将8位字符转换为7位字符?(即Ü到U)


Ben*_*sen 10

philcruz的Regular Expression解决方案的启发,我制作了纯粹的LINQ解决方案

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();
}
Run Code Online (Sandbox Code Playgroud)

这是未经测试的代码.

  • 替换单独的ToText()方法,如何用以下方法替换PureAscii()的第3行:return new string(source.Select(c => c <min?nil:c> max?nil:c).ToArray()) ; (7认同)

小智 5

我发现以下稍微改变的范围对于解析数据库中的注释块很有用,这意味着您不必与制表符和转义字符竞争,这会导致 CSV 字段变得混乱。

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Run Code Online (Sandbox Code Playgroud)

如果您想避免其他特殊字符或特定标点符号,请检查ascii 表


小智 5

不需要正则表达式.只是使用编码...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用.这不会剥离unicode字符,它会用?替换它们?字符. (5认同)
  • 您可以实例化自己的 Encoding 类,它不是替换字符,而是删除它们。请参阅 GetEncoding 方法:https://msdn.microsoft.com/en-us/library/89856k4b(v=vs.110).aspx (2认同)

Pol*_*ton 5

我来这里寻找扩展 ascii 字符的解决方案,但找不到。我找到的最接近的是bzlm's solution。但这仅适用于高达 127 的 ASCII 代码(显然您可以替换他代码中的编码类型,但我认为理解起来有点复杂。因此,共享此版本)。这是一个适用于扩展 ASCII 代码的解决方案,即高达 255ISO 8859-1

它查找并去除非 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:
Run Code Online (Sandbox Code Playgroud)

是代码工作小提琴

根据要求更换编码,其余保持不变。

  • 唯一一个从字符串“Ω c ç ã”中仅删除 Ω 的方法。非常感谢! (2认同)