В то время как усиление КОШКИ Недавно я добавил функцию отправки запросов, включающих смайлики с одной и несколькими кодовыми точками. Это эмодзи с одной кодовой точкой: 🥶
, который может быть представлен в Java в виде строки \uD83E\uDD76
. Тестовый пример прост: вводите смайлики в строки и ожидайте, что конечная точка REST очистит входные данные и полностью удалит их (я понимаю, что это может быть недопустимым случаем для всех API, поэтому поведение настраивается в CATS, но не в центре внимания этой статьи).
Обычно я рекомендую, чтобы любая конечная точка REST очищала ввод перед его проверкой и удаляла специальные символы. Типичным регулярным выражением для этого было бы [\p{C}\p{Z}\p{So}]+
( хотя вы должны улучшить его, чтобы разрешить пробелы между словами), что означает:
p{C}
– сопоставлять невидимые управляющие символы Юникода (\u000D
– возврат каретки, например)p{Z}
– сопоставлять пробелы в Юникоде и невидимые разделители (\u2028
– разделитель строк, например)p{So}
– соответствует различным символам, которые не являются математическими символами, знаками валют или комбинациями символов; сюда также входят смайлики
У меня есть тестовый сервис, который я использую для тестирования новых пушистиков КОШЕК. Идея состояла в том, чтобы просто использовать метод строки replaceAll()
для удаления всех этих символов из строки.
Итак, давайте возьмем следующий простой код, целью которого является очистка заданного ввода:
public static void main(String... args) { String input = "this is a great \uD83E\uDD76 article"; String output = input.replaceAll("[\\p{C}\\p{So}]+", ""); System.out.println("input = " + input); System.out.println("output = " + output); }
Выполняя это с Java 11, я получаю следующий вывод:
input = this is a great 🥶 article output = this is a great article
Который работает, как и ожидалось. Эмодзи 🥶
был удален из строки, как и ожидалось.
Несмотря на то, что у меня есть CATS, скомпилированный для Java 8, я в основном использую JDK11 + для разработки. В какой-то момент у меня были КОШКИ, работающие в конвейере компакт-дисков с JRE 8. Тестовые примеры эмодзи, созданные кошачьими пушистиками, начали терпеть неудачу, даже несмотря на то, что они успешно проходили на моем локальном ящике (и на других конвейерах компакт-дисков). Я просмотрел файлы журнала, полезные данные запроса изначально были созданы и отображались нормально, с правильно напечатанными смайликами, но при выполнении некоторых сопоставлений с образцом в строке результат был напечатан как sometext? и другое
. Тот ?
это то место, где должен был быть смайлик. Дальнейшее расследование привело к выводу, что причиной неправильного обращения с эмодзи была версия JRE (что может быть очевидно для 99,999% разработчиков Java). Что на самом деле ожидается, поскольку Java 8 совместима с Unicode 6.2, в то время как 🥶 является частью Unicode 11 .
Возвращаясь к предыдущему примеру, если я запущу его с Java 8, я получу следующий вывод:
input = this is a great 🥶 article output = this is a great ? article
Выводы:
- Несмотря на то, что версия Java может получать, записывать/хранить и пересылать последние символы Юникода, любая попытка манипулировать ими может привести к странным
?
символы если символ Юникода не относится к версии, поддерживаемой вашей версией JRE - Независимо от того, как вы компилируете код, ЖЮРИ решает, как обрабатываются символы Юникода, т.Е. программа Java, скомпилированная как Java 8, будет вести себя по-разному в JRE 8 по сравнению с JRE 14
Оригинал: “https://dev.to/ludovicianul/make-sure-you-know-which-unicode-version-is-supported-by-your-programming-language-version-5blb”