在字符串中替换Windows-1252以外的所有字符



不得不维护用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

最新更新