我想从字符串中删除以\ xF0(带有ASCII代码0xF0的字符)开头的4字节UTF8字符并尝试
sText = Regex.Replace (sText, "\xF0...", "");
Run Code Online (Sandbox Code Playgroud)
这不起作用.使用两个反斜杠也不起作用.
确切的输入是https://de.wikipedia.org/w/index.php?title=Spezial:Exportieren&action=submit&pages=Unicode的内容4字节字符是文本"[[Violinschlüssel]]"之后的字符,十六进制表示法:.. 0x65 0x6c 0x5d 0x5d 0x20 0xf0 0x9d 0x84 0x9e 0x20 ..预期输出为0x65 0x6c 0x5d 0x5d 0x20 0x20 ..
怎么了?
这些字符将是.NET中使用UTF-16的代理对.它们中的每一个都是两个 UTF-16代码单元,即两个char值.
要删除它们,您可以执行(using System.Linq;):
sText = string.Concat(sText.Where(x => !char.IsSurrogate(x)));
Run Code Online (Sandbox Code Playgroud)
(使用Concat.NET 4.0 中引入的重载(Visual Studio 2010)).
延迟添加:它可以提供更好的使用性能:
sText = new string(sText.Where(x => !char.IsSurrogate(x)).ToArray());
Run Code Online (Sandbox Code Playgroud)
即使它看起来更糟.(适用于.NET 3.5(Visual Studio 2008).)