5

C# を使用して、文字列から utf8mb4 文字 (絵文字など) を削除して、結果が完全に utf8 に準拠する方法を教えてください。

ほとんどの解決策にはデータベース構成の変更が含まれますが、残念ながら私にはその可能性がありません。

4

1 に答える 1

7

replacementCharacterこれにより、サロゲート文字が(場合によってはstring.Empty)に置き換えられるはずです。

を考えると、これはMySqlの問題utf8mb4です。MySql の utf8 と utf8mb4 の違いは次のとおりです違いは、utf8 が 4 バイトの utf8 シーケンスをサポートしていないことです。wikiを見ると、4 バイトの utf8 シーケンスは > 0xFFFF であるため、utf16 では 2 つ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();
}
于 2015-05-22T10:03:25.003 に答える