从字符串中删除所有非ASCII字符

use*_*498 47 c# ascii

我有一个C#例程,它从CSV文件导入数据,将其与数据库匹配,然后将其重写为文件.源文件似乎有一些非ASCII字符,这些字符会污染处理程序.

我已经有一个静态方法,我运行每个输入字段,但它执行基本检查,如删除逗号和引号.有谁知道如何添加删除非ASCII字符的功能?

Jai*_*der 55

一个简单的解决方案:

public static bool IsASCII(this string value)
{
    // ASCII encoding replaces non-ascii with question marks, so we use UTF8 to see if multi-byte sequences are there
    return Encoding.UTF8.GetByteCount(value) == value.Length;
}
Run Code Online (Sandbox Code Playgroud)

来源:http://snipplr.com/view/35806/

  • -1; 问题是"删除非ASCII字符的功能",这是不行的.*title*含糊不清,但解决方法是澄清标题(我已经完成),而不是回答OP没有提出的问题.对于与您发布的问题不同的问题,这可能是一个很好的答案,但对您所做的问题不回答. (7认同)
  • 该解决方案具有在便携式类库中工作的优点,其中Encoding.ASCII不可用. (4认同)
  • 它还具有比接受的解决方案快得多的好处,因为它不需要实际创建编码的字符串. (4认同)

ETo*_*reo 44

string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,使用asciiencoding会将所有非ascii字符替换为'?'(63),这可能是也可能不是您想要或期望的. (15认同)
  • 此外,如果`s == sOut`,你可以检查它是否只包含ASCII (12认同)

pap*_*zzo 13

一劳永逸

public string ReturnCleanASCII(string s)
{
    StringBuilder sb = new StringBuilder(s.Length);
    foreach(char c in s)
    {
       if((int)c > 127) // you probably don't want 127 either
          continue;
       if((int)c < 32)  // I bet you don't want control characters 
          continue;
       if(c == ',')
          continue;
       if(c == '"')
          continue;
       sb.Append(c);
    }
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)


Eri*_* J. 8

如果你想测试一个特定的角色,你可以使用

if ((int)myChar <= 127)
Run Code Online (Sandbox Code Playgroud)

只是获取字符串的ASCII编码不会告诉您特定字符是非ASCII开头(如果您关心).请参阅MSDN.


roo*_*024 5

这是对已接受答案的改进:

string fallbackStr = "";

Encoding enc = Encoding.GetEncoding(Encoding.ASCII.CodePage,
  new EncoderReplacementFallback(fallbackStr),
  new DecoderReplacementFallback(fallbackStr));

string cleanStr = enc.GetString(enc.GetBytes(inputStr));
Run Code Online (Sandbox Code Playgroud)

此方法将用的值替换未知字符fallbackStr,如果fallbackStr为空,则将其完全排除。(请注意,enc可以在函数范围之外定义。)