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