用空格替换 Unicode 字符“�”
Posted
技术标签:
【中文标题】用空格替换 Unicode 字符“�”【英文标题】:Replace Unicode character "�" with a space 【发布时间】: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().:%-/ ]+$";
没有任何作用。
我该如何替换它?
来源:
Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
Trying to replace all white space with a single space
Strip the byte order mark from string in C#
Remove extra whitespaces, but keep new lines using a regular expression in C#
已编辑
这是原始字符串:
“葡萄糖持续监测系统”
采用 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]
参考文献
Regular expressions (MDN)【问题讨论】:
问题可能是在您将其作为字符串获取之前发生的,这是从字节到文本的解码过程的一部分。不过你还没有向我们展示。 如果你只是想清理一个文件,你可以在 notepad++ 中进行,如果你不想以编程方式进行, 该符号是\pS
Unicode 类别类的一部分。试试Regex.Replace(str, @"\pS+", "")
。如果它不起作用,则字符串不包含该符号,问题就在那里。请注意,您的一些尝试(@"[^\S\r\n]+"
、@"\s+"
(该字符不是空格)和"^[\S\r\n0-9A-Za-z().:%-/ ]+$"
(添加\S
使其匹配所有非空白字符,并且您应该在此处使用逐字字符串文字)没有意义。修剪也没有意义,因为字符不在前导/尾随位置。
@johnny-5 我需要对其进行编程,问题是客户端,他们填充了 .csv 文件
如果不清楚,这些字节是字节顺序标记 (BOM) 并且是 Unicode 编码格式的一部分。将字符串读取为正确的 Unicode 可能会解决此问题。或者,由于人们错误地修改了文件,标记可能已被多次添加。无论哪种方式,请注意,在不了解它的情况下将其删除可能会导致将来出现问题。
【参考方案1】:
使用 String.Replace:
使用简单的String.Replace()
。
我假设您要删除的唯一字符是您在问题中提到的字符:�
,并且您想用普通空格替换它们。
string text = "imp�ortant";
string cleaned = text.Replace('\u00ef', ' ')
.Replace('\u00bf', ' ')
.Replace('\u00bd', ' ');
// Returns 'imp ortant'
或使用 Regex.Replace:
string cleaned = Regex.Replace(text, "[\u00ef\u00bf\u00bd]", " ");
// Returns 'imp ortant'
试试看:Dotnet Fiddle
【讨论】:
这不起作用。它实际上是单个字符 U+FFFD(十进制 65533)。奇怪的是 c# 会吐出“�”,而我的十六进制编辑器从源代码中将它显示为 U+00B7。更多信息:***.com/a/1488920【参考方案2】:定义一个 ASCII 字符范围,并替换不在该范围内的任何内容。
我们只想找到 Unicode 字符,所以我们将匹配一个 Unicode 字符并替换。
Regex.Replace("This is my te\uFFFDxt from csv file", @"[^\u0000-\u007F]+", " ")
上面的模式将匹配任何 not ^
在此范围 [ ]
的集合 \u0000-\u007F
(ASCII 字符(所有超过 \u007F 的都是 Unicode))并将其替换为一个空格。
结果
This is my te xt from csv file
您可以根据需要调整\u0000-\u007F
提供的范围,以扩大允许的字符范围以满足您的需要。
【讨论】:
@WiktorStribiżew 您在手机上使用什么应用程序来检查 SO?【参考方案3】:如果您只想要 ASCII,请尝试以下操作:
var ascii = new ASCIIEncoding();
byte[] encodedBytes = ascii.GetBytes(text);
var cleaned = ascii.GetString(encodedBytes).Replace("?", " ");
【讨论】:
以上是关于用空格替换 Unicode 字符“�”的主要内容,如果未能解决你的问题,请参考以下文章