从UTF-8字符串中删除控制字符

15

我发现了这个问题,但它也删除了所有有效的utf-8字符(返回一个空字符串,尽管其中包含有有效的utf-8字符和控制字符)。根据我的理解,关于utf-8,并没有一个特定的范围来表示控制字符,每个字符集都有自己的控制字符

如何修改上述解决方案以仅删除控制字符


3
你知道,只需几行代码(utf-8字符串是什么?)和一小段文本样本,这将开始看起来像一个真正的问题。 - H H
实际字符串是一个阿拉伯utf-8字符串,其中包含一些分号和控制字符。我提供了一个链接,链接到最相似的问题:https://dev59.com/pnVD5IYBdhLWcg3wTZ1m - Xaqron
你如何定义控制字符?是指那些代码点为 <32 的字符吗? - CodesInChaos
@CodeInChaos:我发现问题不在于真正的控制字符。任何特殊字符,如“"”、“;”等都会造成问题。我试图将字符串设置为HttpHeader,但出现了这个异常:“指定的值具有无效的控制字符”。 - Xaqron
3个回答

25

这是我的行事方式:

Regex.Replace(evilWeirdoText, @"[\u0000-\u001F]", string.Empty)

此命令剥离了前31个控制字符。比\u001F高一个十六进制的值是\u0020,也就是空格。在空格之前的所有字符都是换行和空字符。

如需查看字符,请参考:http://donsnotes.com/tech/charsets/ascii.html


它只会过滤ASCII字符(UTF-8 C0控制字符,但不包括“删除(rubout)”),但问题是关于UTF-8的。在那里,您有更多的控制字符(UTF-8 C1控制字符)。 - InLaw

23

我认为以下代码对你有用:

public static string RemoveControlCharacters(string inString)
{
    if (inString == null) return null;
    StringBuilder newString = new StringBuilder();
    char ch;
    for (int i = 0; i < inString.Length; i++)
    {
        ch = inString[i];
        if (!char.IsControl(ch))
        {
            newString.Append(ch);
        }
    }
    return newString.ToString();
}

谢谢。我仍然在尝试将字符串设置为HttpHeader时遇到“指定的值具有无效的控制字符”异常。 - Xaqron
@Xaqon 它不能处理所有的控制字符。我已经将条件更改为!char.IsControl(ch),现在应该可以正常工作了。 - Centro
我找到了问题,它与真正的“控制字符”无关。任何特殊字符,如 \"; 等都会导致问题。我不知道如何从 utf-8 字符串中删除它们。 - Xaqron
@Xaqron 在你的情况下,什么是“特殊”字符?任何非字母数字字符吗?你应该定义这些特殊字符并更改条件。 - Centro
例如,1563是一个“;”并且会造成问题。我想在所有语言中排除所有非字母字符。 - Xaqron
2
@Xaqron:使用 char.IsLetter() 方法。 - Jalal Said

0
如果您计划将字符串用作查询字符串,发送之前应考虑使用Uri.EscapeUriString()Uri.EscapeDataString()进行转义。 注意:您可能仍然需要先从char.IsControl()中提取任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接