用空格替换 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 字符“�”的主要内容,如果未能解决你的问题,请参考以下文章

在PHP中替换MS智能引号

java中的空格和回车符怎样输入。

中文字符替换为其unicode编码值小3的字符

如何替换掉字符串里的空格?

用 JavaScript 字符串中的单个空格替换多个空格

保存文件iOS时用空格字符替换%20