Экранирование нелатинских символов в Java - PullRequest
0 голосов
/ 31 января 2020

У меня есть программа Java, которая принимает строку и экранирует ее, чтобы ее можно было безопасно передать программе в bash. Стратегия в основном состоит в том, чтобы избежать любого из специальных символов, упомянутых здесь , и заключить результат в двойные кавычки.

Алгоритм довольно прост - просто l oop над строкой ввода и используйте input.charAt(i), чтобы проверить, нужно ли экранировать текущий символ.

Эта стратегия хорошо работает для символы, которые не представлены суррогатными парами , но у меня есть некоторые опасения, если в строку встроены нелатинские символы или что-то вроде эмодзи. В этом случае, если мы предположим, что emoji был первым символом в моей входной строке, input.charAt(0) выдаст мне первую кодовую единицу, а input.charAt(1) вернет вторую кодовую единицу. Меня беспокоит то, что некоторые из этих блоков кода могут быть интерпретированы как один из специальных символов, которые необходимо экранировать. Если бы это произошло, я бы попытался избежать одного из блоков кода, который безвозвратно исказил бы ввод.

Возможна ли такая вещь? Или безопасно использовать input.charAt(i) для чего-то подобного?

1 Ответ

2 голосов
/ 01 февраля 2020

Из Java документов :

Платформа Java 2 использует представление UTF-16 в массивах символов и в классах String и StringBuffer. В этом представлении дополнительные символы представлены в виде пары значений символов, первое из диапазона верхних суррогатов (\ uD800- \ uDBFF), второе из диапазона нижних суррогатов (\ uDC00- \ uDFFF).

Со страницы UTF-16 Wikipedia :

U + D800 до U + DFFF: стандарт Unicode постоянно резервирует эти значения кодовой точки для UTF- 16 кодирование верхних и нижних суррогатов, и им никогда не будет назначен символ, поэтому не должно быть оснований для их кодирования. Официальный стандарт Unicode гласит, что никакие формы UTF, включая UTF-16, не могут кодировать эти кодовые точки.

Из charAt javado c:

Возвращает значение char по указанному индексу. Индекс находится в диапазоне от 0 до length () - 1. Первое значение последовательности в последовательности соответствует индексу 0, следующее - индексу 1 и т. Д., Как для индексации массива.

Если указано значение char если индекс является суррогатом, возвращается суррогатное значение.

Нет никакого совпадения между диапазоном кодовых точек суррогатной пары и диапазоном, в котором находятся мои специальные символы ($, `, \ et c ) существуют, поскольку все они используют сопоставления символов ASCII (то есть все они отображаются между 0 и 255).

Поэтому, если я сканирую строку, которая содержит, скажем, смайлики (что определенно за пределами дополнительного диапазона символов) Я не буду путать ни один из элементов в суррогатной паре за специальный символ. Вот простая тестовая программа: enter image description here enter image description here

...