【发布时间】:2017-10-15 15:28:45
【问题描述】:
我正在从 .csv 文件中大量上传信息,我需要将这个非 ASCII 字符“�”替换为普通空格“”。
字符“�”对应于 C、C++ 和 Java 的“\uFFFD”,它似乎被称为REPLACEMENT CHARACTER。还有其他的,如C#官方文档中的U+FEFF、U+205F、U+200B、U+180E、U+202F等空格类型。
我正在尝试以这种方式替换:
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 文件的 my�texto”
我也尝试了一些解决方案:
尝试解决方案 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:将 [\S\r\n] 添加到 validCharacters
string validCharacters = "^[\S\r\n0-9A-Za-z().:%-/ ]+$";
没有任何作用。
我该如何替换它?
来源:
已编辑
这是原始字符串:
“葡萄糖持续监测系统”
采用 0x... 表示法
系统 OF0xA0 持续监测葡萄糖
解决方案
转到 Unicode code converter。查看转换并进行替换。
就我而言,我做了一个简单的替换:
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]
参考文献
【问题讨论】:
-
问题可能是在您将其作为字符串获取之前发生的,这是从字节到文本的解码过程的一部分。不过你还没有向我们展示。
-
如果你只是想清理一个文件,你可以在 notepad++ 中进行,如果你不想以编程方式进行,
-
该符号是
\p{S}Unicode 类别类的一部分。试试Regex.Replace(str, @"\p{S}+", "")。如果它不起作用,则字符串不包含该符号,问题就在那里。请注意,您的一些尝试(@"[^\S\r\n]+"、@"\s+"(该字符不是空格)和"^[\S\r\n0-9A-Za-z().:%-/ ]+$"(添加\S使其匹配所有非空白字符,并且您应该在此处使用逐字字符串文字)没有意义。修剪也没有意义,因为字符不在前导/尾随位置。 -
@johnny-5 我需要对其进行编程,问题是客户端,他们填充了 .csv 文件
-
如果不清楚,这些字节是字节顺序标记 (BOM) 并且是 Unicode 编码格式的一部分。将字符串读取为正确的 Unicode 可能会解决此问题。或者,由于人们错误地修改了文件,标记可能已被多次添加。无论哪种方式,请注意,在不了解它的情况下将其删除可能会导致将来出现问题。
标签: c# regex validation trim