使用C#如何从字符串中删除utf8mb4字符(表情符号等),以便结果符合utf8标准。
大多数解决方案涉及更改数据库配置,但遗憾的是我没有这种可能性。
答案 0 :(得分:6)
这应该用replacementCharacter
取代代理字符(甚至可能是string.Empty
)
这是一个MySql问题,给定utf8mb4
。 Here 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();
}