如何删除字符串中的任何utf8mb4字符

时间:2015-05-22 09:09:39

标签: c# .net utf-8 utf8mb4

使用C#如何从字符串中删除utf8mb4字符(表情符号等),以便结果符合utf8标准。

大多数解决方案涉及更改数据库配置,但遗憾的是我没有这种可能性。

1 个答案:

答案 0 :(得分:6)

这应该用replacementCharacter取代代理字符(甚至可能是string.Empty

这是一个MySql问题,给定utf8mb4Here MySql中的utf8和utf8mb4之间存在差异。不同之处在于utf8不支持4字节utf8序列。通过查看wiki,4字节utf8序列是那些> 0xFFFF,因此在utf16中需要两个char(名为代理项对)。此方法删除代理对字符。找到"耦合" (高+低代理对),然后单个replacementCharacter被替换,否则孤立(错误)高或低代理对被replacementCharacte替换。

public static string RemoveSurrogatePairs(string str, string replacementCharacter = "?")
{
    if (str == null)
    {
        return null;
    }

    StringBuilder sb = null;

    for (int i = 0; i < str.Length; i++)
    {
        char ch = str[i];

        if (char.IsSurrogate(ch))
        {
            if (sb == null)
            {
                sb = new StringBuilder(str, 0, i, str.Length);
            }

            sb.Append(replacementCharacter);

            // If there is a high+low surrogate, skip the low surrogate
            if (i + 1 < str.Length && char.IsHighSurrogate(ch) && char.IsLowSurrogate(str[i + 1]))
            {
                i++;
            }
        }
        else if (sb != null)
        {
            sb.Append(ch);
        }
    }

    return sb == null ? str : sb.ToString();
}