加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何从字符串中删除无效代码点?

发布时间:2020-12-15 06:26:29 所属栏目:百科 来源:网络整理
导读:我有一个需要提供标准化字符串的例程.但是,进入的数据不一定是干净的,如果字符串包含无效的代码点,String.Normalize()会引发ArgumentException. 我想做的只是用诸如’?’的一次性字符替换这些代码点.但是要做到这一点,我需要一种有效的方式来搜索字符串,首
我有一个需要提供标准化字符串的例程.但是,进入的数据不一定是干净的,如果字符串包含无效的代码点,String.Normalize()会引发ArgumentException.

我想做的只是用诸如’?’的一次性字符替换这些代码点.但是要做到这一点,我需要一种有效的方式来搜索字符串,首先找到它们.什么是好的方法呢?

以下代码工作,但它基本上使用try / catch作为粗略的if语句,所以性能是可怕的.我只是分享它来说明我正在寻找的行为:

private static string ReplaceInvalidCodePoints(string aString,string replacement)
{
    var builder = new StringBuilder(aString.Length);
    var enumerator = StringInfo.GetTextElementEnumerator(aString);

    while (enumerator.MoveNext())
    {
        string nextElement;
        try { nextElement = enumerator.GetTextElement().Normalize(); }
        catch (ArgumentException) { nextElement = replacement; }
        builder.Append(nextElement);
    }

    return builder.ToString();
}

(编辑:)我正在考虑将文本转换为UTF-32,以便我可以快速迭代它,并查看每个双字是否对应一个有效的代码点.有没有这样做的功能?如果没有,是否有无效范围列表在那里浮动?

解决方法

看来,唯一的办法就是像你这样做的“手动”.这是一个与您的结果相同的版本,但是速度要快一点(在char.MaxValue中的所有字符串的大约4倍),而不需要不安全的代码.我也简化和评论了我的IsCharacter方法来解释每个选择:
static string ReplaceNonCharacters(string aString,char replacement)
{
    var sb = new StringBuilder(aString.Length);
    for (var i = 0; i < aString.Length; i++)
    {
        if (char.IsSurrogatePair(aString,i))
        {
            int c = char.ConvertToUtf32(aString,i);
            i++;
            if (IsCharacter(c))
                sb.Append(char.ConvertFromUtf32(c));
            else
                sb.Append(replacement);
        }
        else
        {
            char c = aString[i];
            if (IsCharacter(c))
                sb.Append(c);
            else
                sb.Append(replacement);
        }
    }
    return sb.ToString();
}

static bool IsCharacter(int point)
{
    return point < 0xFDD0 || // everything below here is fine
        point > 0xFDEF &&    // exclude the 0xFFD0...0xFDEF non-characters
        (point & 0xfffE) != 0xFFFE; // exclude all other non-characters
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读