Рубрики
Без рубрики

Убедитесь, что вы знаете, какая версия Unicode поддерживается вашей версией языка программирования

Улучшая CATS, я недавно добавил функцию отправки запросов, включающих один и несколько кодов… Помеченный как java, безопасность, юникод.

В то время как усиление КОШКИ Недавно я добавил функцию отправки запросов, включающих смайлики с одной и несколькими кодовыми точками. Это эмодзи с одной кодовой точкой: 🥶 , который может быть представлен в 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”