不得不维护用VB6编写的旧程序,我发现自己有这个问题。
我需要找到一种有效的方法来搜索字符串中Windows-1252集合之外的所有字符,并将它们替换为"_"。我可以用c#
到目前为止,我已经通过创建一个包含所有1252个字符的字符串来实现这一点,是否有更快的方法?我可能需要为文本文件中的数百万条记录执行此操作
string 1252chars = ""!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶•¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿŸžœ›š™˜—–•""’’ŽŽ‹Š‰vˆ‡†…„ƒ‚€ ""
//Replace all characters not in the string above...
您是否尝试规范化字符串?string.Normalize()
方法用于删除所有不属于Windows-1252字符集的字符。https://learn.microsoft.com/de de/dotnet/api/system.string.normalize?view=net - 7.0
string inputString = "Some input string";
string outputString = inputString.Normalize(NormalizationForm.FormD);
或者,您可以使用循环来检查字符串中的每个字符,并使用StringBuilder类删除不在Windows-1252集合中的字符。
string inputString = "Some input string";
StringBuilder sb = new StringBuilder();
foreach (char c in inputString)
{
if (c <= 'u00FF')
{
sb.Append(c);
}
}
string outputString = sb.ToString();
Encoding
类可以非常有效地实现这一点。在与编码之间进行转换时,可以指定替换字符。
using System;
using System.Text;
public class Program
{
public static void Main()
{
// For .NET core only:
// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var text = "abc絵de😂fgh";
text = Win1252Safe(text);
Console.WriteLine(text);
}
private static Encoding Win1252R = Encoding.GetEncoding(1252,
new EncoderReplacementFallback("_"),
new DecoderReplacementFallback("_"));
public static string Win1252Safe(string text) {
var bytes = Win1252R.GetBytes(text);
return Win1252R.GetString(bytes);
}
}
abc_de__fgh