如何从字符串中剥离非ascii字符?(c#)
当前回答
受philcruz的正则表达式解决方案的启发,我做了一个纯LINQ解决方案
public static string PureAscii(this string source, char nil = ' ')
{
var min = '\u0000';
var max = '\u007F';
return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}
public static string ToText(this IEnumerable<char> source)
{
var buffer = new StringBuilder();
foreach (var c in source)
buffer.Append(c);
return buffer.ToString();
}
这是未经测试的代码。
其他回答
下面是一个不使用正则表达式的纯。net解决方案:
string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.GetEncoding(
Encoding.ASCII.EncodingName,
new EncoderReplacementFallback(string.Empty),
new DecoderExceptionFallback()
),
Encoding.UTF8.GetBytes(inputString)
)
);
它可能看起来很麻烦,但应该是直观的。它使用。net ASCII编码来转换字符串。在转换过程中使用UTF8,因为它可以表示任何原始字符。它使用EncoderReplacementFallback来将任何非ascii字符转换为空字符串。
public string ReturnCleanASCII(string s)
{
StringBuilder sb = new StringBuilder(s.Length);
foreach (char c in s)
{
if ((int)c > 127) // you probably don't want 127 either
continue;
if ((int)c < 32) // I bet you don't want control characters
continue;
if (c == '%')
continue;
if (c == '?')
continue;
sb.Append(c);
}
return sb.ToString();
}
如果你不想剥离,而是真正地将拉丁重音字符转换为非重音字符,看看这个问题:我如何将8位字符转换为7位字符?(即Ü到U)
如果你想要一个只有ISO-8859-1字符并且排除非标准字符的字符串,你应该使用这个表达式:
var result = Regex.Replace(value, @"[^\u0020-\u007E\u00A0-\u00FF]+", string.Empty);
注意:使用Encoding.GetEncoding("ISO-8859-1")方法将不能完成这项工作,因为未定义的字符不会被排除在外。
.Net小提琴样本
维基百科ISO-8859-1代码页获取更多详细信息。
我用了这个正则表达式:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");