C# を使用して、文字列から utf8mb4 文字 (絵文字など) を削除して、結果が完全に utf8 に準拠する方法を教えてください。
ほとんどの解決策にはデータベース構成の変更が含まれますが、残念ながら私にはその可能性がありません。
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();
}