У меня есть строки с различными символами, которые необходимо записать в Google BigQuery, для которого требуются строгие строки UTF8.Когда я пытаюсь написать строки с большим количеством входных смайликов, я получаю сообщение об ошибке:
java.lang.IllegalArgumentException: Unpaired surrogate at index 3373
at org.apache.beam.sdk.repackaged.com.google.common.base.Utf8.encodedLengthGeneral(Utf8.java:93)
at org.apache.beam.sdk.repackaged.com.google.common.base.Utf8.encodedLength(Utf8.java:67)
at org.apache.beam.sdk.coders.StringUtf8Coder.getEncodedElementByteSize(StringUtf8Coder.java:145)
...
У меня есть обходной путь для этой проблемы, чтобы просто убрать все суррогатные символы из строк:
private static String removeSurrogates(String query) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < query.length(); i++) {
char c = query.charAt(i);
if (!(Character.isHighSurrogate(c) || Character.isLowSurrogate(c))) {
sb.append(c);
}
}
return sb.toString();
}
Однако, это приводит к строке вроде
????????⚔⌨?⛳?????????????⛏?
Сокращение до четырех смайликов
⚔⌨⛳⛏
Есть ли правильный способ конвертировать эти символы в UTF8 без потерь и без использования непарных суррогатов?
(Извинениямоё понимание наборов символов в целом не велико)