如何在 groovy 中将 utf-8mb4 更改为 UTF-8?

How to change utf-8mb4 to UTF-8 in groovy?

目前,我在接收来自用户手机的字符串输入时遇到问题。 输入的字符串包含 utf8mb4 字符(笑脸、表情符号等)。 这导致我的后端出错 (mysql),因为它只接受 utf-8 输入。

现在,我怎样才能将所有 utf-8mb4 输入替换为 utf-8?

def utf8mb4string = '';
// parse the utf8mb4string to utf8
// logic here
//possible utf8 result maybe: '�������' 

我在这里也发现了类似的问题How would I convert UTF-8mb4 to UTF-8? 但还没有明确的答案,尤其是在 Groovy.

中的实施

can't store characters(如 "man with turban")来自基本多语言平面 (BMP) 之外,使用 MySQL 命名不当的 "utf8" 编码。您需要改为指定 "utf8mb4"。

如果您不想存储这些字符,并且想要替换或丢弃它们,则必须遍历字符串,并构建一个新字符串(在 Java 中):

IntStream converted = utf8mb4string.codePoints().map(cp -> Character.isBmpCodePoint(cp) ? cp : '\uFFFD');
String str = converted.collect(StringBuilder::new, (buf, ch) -> buf.append((char) ch), StringBuilder::append).toString();

或者,在 Groovy 语法中:

def transform = { String it ->
  char ch = it.charAt(0)
  if (Character.isHighSurrogate(ch))
    return '\uFFFD'
  else if (Character.isLowSurrogate(ch))
    return ''
  else
    return it;
}
utf8mb4string.collect(transform).join()