我正在从.csv文件中进行大批量信息上传,需要将这个非ASCII字符“�”替换为普通空格,“ ”。
字符“�”在C、C++和Java中对应“\uFFFD”,它似乎被称为REPLACEMENT CHARACTER。还有其他类型的空格,如U+FEFF、U+205F、U+200B、U+180E和U+202F在C#的官方文档中。
我尝试用以下方式进行替换:
public string Errors = "";
public void test(){
string textFromCsvCell = "";
string validCharacters = "^[0-9A-Za-z().:%-/ ]+$";
textFromCsvCell = "This is my text from csv file"; //All spaces aren't normal space " "
string cleaned = textFromCsvCell.Replace("\uFFFD", "\"")
if (Regex.IsMatch(cleaned, validCharacters ))
//All code for insert
else
Errors=cleaned;
//print Errors
}
测试方法显示给我这个文本:
"这是来自CSV文件的我的文本"
我也尝试了一些解决方案:
尝试解决方案1:使用Trim
Regex.Replace(value.Trim(), @"[^\S\r\n]+", " ");
尝试解决方案2:使用替换。
System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ");
尝试解决方案3:使用Trim
String.Trim(new char[]{'\uFEFF', '\u200B'});
尝试解决方案4:在validCharacters中添加[\S\r\n]。
string validCharacters = "^[\S\r\n0-9A-Za-z().:%-/ ]+$";
什么都不起作用。
我该如何替换它?
参考资料:
编辑
这是原始字符串:
"SYSTEM OF MONITORING CONTINUES OF GLUCOSE"
以0x...表示法
SYSTEM OF0xA0MONITORING CONTINUES OF GLUCOSE
解决方案
转到Unicode代码转换器。查看转换并进行替换。
在我的情况下,我进行了简单的替换:
string value = "SYSTEM OF MONITORING CONTINUES OF GLUCOSE";
//value contains non-breaking whitespace
//value is "SYSTEM OF�MONITORING CONTINUES OF GLUCOSE"
string cleaned = "";
string pattern = @"[^\u0000-\u007F]+";
string replacement = " ";
Regex rgx = new Regex(pattern);
cleaned = rgx.Replace(value, replacement);
if (Regex.IsMatch(cleaned,"^[0-9A-Za-z().:<>%-/ ]+$"){
//all code for insert
else
//Error messages
这个表达式表示所有可能的空格:空格,制表符,分页符,换行符和回车符。
[ \f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]
参考资料
\p{S}
Unicode类别类的一部分。只需尝试Regex.Replace(str, @"\p{S}+", "")
。如果它不起作用,则字符串中不存在该符号,并且问题就在那里。请注意,你的一些尝试(@"[^\S\r\n]+"
,@"\s+"
(该字符不是空格)和"^ [\ S \ r \ n0-9A-Za-z ().:%-/ ] + $"
(添加\S
使其匹配所有非空格字符,在这里应使用逐字字符串文字))没有意义。修剪也没有意义,因为该字符不处于前导/尾随位置。 - Wiktor Stribiżew\x20
)。 - Wiktor Stribiżew