Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串中删除所有非ASCII字符_C#_Ascii - Fatal编程技术网

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

C# 从字符串中删除所有非ASCII字符,c#,ascii,C#,Ascii,我有一个C#例程,它从CSV文件导入数据,将其与数据库进行匹配,然后将其重写为一个文件。源文件似乎有一些非ASCII字符,这些字符会影响处理例程 我已经有了一个静态方法,可以运行每个输入字段,但它执行基本检查,比如删除逗号和引号。有人知道我如何添加删除非ASCII字符的功能吗?删除非ASCII字符听起来有点奇怪 string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s)) 此外,我始终推荐用于解析CSV文件的优秀库。如果您

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


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

删除非ASCII字符听起来有点奇怪

string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))

此外,我始终推荐用于解析CSV文件的优秀库。

如果您想测试特定字符,可以使用

if ((int)myChar <= 127)

if((int)myChar这里有一个简单的解决方案:

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;
}
来源:

公共字符串RunCharacterCheckASCII(字符串s)
{
字符串str=s;
bool是_find=false;
char ch;
int-ich=0;
尝试
{
char[]schar=str.ToCharArray();
对于(int i=0;i127)//非ascii或扩展ascii
{
是真的吗;
schar[i]='?';
}
}
如果(正在查找)
str=新字符串(SCAR);
}
捕获(例外情况除外)
{
}
返回str;
}
一次完成所有操作

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();
}
公共字符串返回CleanASCII(字符串s)
{
StringBuilder sb=新StringBuilder(s.长度);
foreach(字符c在s中)
{
如果((int)c>127)//您可能也不想要127
继续;
if((int)c<32)//我打赌您不需要控制字符
继续;
如果(c==',')
继续;
如果(c==“”)
继续;
sb.附加(c);
}
使某人返回字符串();
}

以下是对公认答案的改进:

string fallbackStr=”“;
Encoding enc=Encoding.GetEncoding(Encoding.ASCII.CodePage,
新编码器替换回退(回退器),
新解码器替换回退(fallbackStr));
string cleanStr=enc.GetString(enc.GetBytes(inputStr));

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

需要注意的是,使用ascienceoding将所有非ascii字符替换为“?”(63),这可能不是您想要的或期望的。此外,您可以检查它是否只包含ASCII,如果
s==sOut
此解决方案的优点是可以在不提供Encoding.ASCII的可移植类库中工作。它还具有比公认的解决方案快得多的优点,因为它不需要实际使用创建一个编码字符串。-1;问题要求“删除非ASCII字符的功能”,但这并没有做到。标题模棱两可,但解决方法是澄清标题(我已经这样做了),而不是回答OP没有问的问题。这可能是一个与您发布的问题不同的好答案,但不是您所做的问题的答案。您是天才!我想要制表符、换行符和回车符(9、10、13),所以我只添加了
if((int)c==9 | |(int)c==10 | |(int)c==13)
作为第一个if并附加它。
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();
}