Intereting Posts
Как предоставить параметры с помощью текстового файла в curl? Почему я получаю «строка 1: $ ': \ r': command not found"? NetworkManager изменяет политику маршрутизации по умолчанию Xlib без X11? Любая библиотека или система способна это сделать? «Открыть с помощью» в режиме «Виртуальный бокс» В xmonad, как я могу привязать сочетание клавиш, чтобы привести меня в определенное окно? Запись оболочки для интерактивных команд Как навалом конвертировать весь файл в ветку файловой системы между Unix и Windows break break? Как установить с помощью pacman в ArchLinux без запроса пользователя y / n? Как получить набор исправлений ядра linux из списка рассылки? Удалить полную строку в текстовых файлах на основе тегов Inotifywait для большого количества файлов в каталоге Не получать динамический IP-адрес от dhclient на виртуальной Fedora Визуальная обратная связь для фокуса окна с помощью Alt-Tab? (Корица) Смонтируйте папку с сервера в сети на локальной машине

Как создать строку с недопустимыми символами юникода, в Zsh?

Для некоторых целей тестирования мне нужна строка с недопустимыми символами юникода. Как создать такую ​​строку в Zsh?

Я предполагаю, что вы имеете в виду символы кодировки Юникода, кодированные UTF-8.

Это зависит от того, что вы подразумеваете под недействительным .

invalid_byte_sequence=$'\x80\x81' 

Это последовательность байтов, которая сама по себе недействительна в кодировке UTF-8 (первый байт в кодированном символе UTF-8 всегда имеет два старших бита). Эта последовательность может быть видна в середине символа, хотя, таким образом, он мог бы закончить формирование правильной последовательности после конкатенирования с другой недопустимой последовательностью, такой как $'\xe1' . $'\xe1' или $'\xe1\x80' также были бы недопустимыми и могли бы рассматриваться как усеченный символ.

 other_invalid_byte_sequence=$'\xc2\xc2' 

Байт 0xc2 запускает двухбайтовый символ, а 0xc2 не может находиться в середине символа UTF-8. Таким образом, последовательность не может быть найдена в действительном тексте UTF-8. То же самое для $'\xc0' или $'\xc1' которые являются байтами, которые никогда не появляются в кодировке UTF-8.

Для последовательностей \uXXXX и \UXXXXXXXX я предполагаю, что кодировка текущего языка является UTF-8.

 non_character=$'\ufffe' 

Это один из 66 указанных в настоящее время несимволов.

 not_valid_anymore=$'\U110000' 

Юникод теперь ограничен точками кода до 0x10FFFF. И кодировка UTF-8, которая изначально была предназначена для покрытия до 0x7FFFFFFF ( perl также поддерживает вариант, который идет на 0xFFFFFFFFFFFFFFFF), теперь также условно ограничивается этим.

 utf16_surrogate=$'\ud800' 

Точки кода 0xD800 до 0xDFFF – это коды, зарезервированные для кодировки UTF16. Таким образом, кодировка этих кодов UTF-8 недействительна.

Теперь большинство оставшихся кодовых точек по-прежнему не назначены в последней версии Unicode.

 unassigned=$'\u378' 

Новые версии Unicode имеют новые символы. Например, Unicode 8.0 (выпущен в июне 2015 года) имеет 🤗 ( U + 1F917 ), который не был назначен в более ранних версиях.

 unicode_8_and_above_only=$'\U1f917' 

Некоторые тесты с uconv :

 $ printf %s $invalid_byte_sequence| uconv -x any-name Conversion to Unicode from codepage failed at input byte position 0. Bytes: 80 Error: Illegal character found Conversion to Unicode from codepage failed at input byte position 1. Bytes: 81 Error: Illegal character found $ printf %s $other_invalid_byte_sequence| uconv -x any-name Conversion to Unicode from codepage failed at input byte position 0. Bytes: c2 Error: Illegal character found Conversion to Unicode from codepage failed at input byte position 1. Bytes: c2 Error: Truncated character found $ printf %s $non_character| uconv -x any-name \N{<noncharacter-FFFE>} $ printf %s $not_valid_anymore| uconv -x any-name Conversion to Unicode from codepage failed at input byte position 0. Bytes: f4 90 80 80 Error: Illegal character found $ printf %s $utf16_surrogate | uconv -x any-name Conversion to Unicode from codepage failed at input byte position 0. Bytes: ed a0 80 Error: Illegal character found $ printf %s $unassigned | uconv -x any-name \N{<unassigned-0378>} $ printf %s $unicode_8_and_above_only | uconv -x any-name \N{<unassigned-1F917>} $ 

С GNU grep вы можете использовать grep . чтобы увидеть, может ли он найти символ на входе:

 l=(invalid_byte_sequence other_invalid_byte_sequence non_character not_valid_anymore utf16_surrogate unassigned unicode_8_and_above_only) for c ($l) print -r ${(P)c} | grep -q . && print $c 

Который для меня дает:

 non_character not_valid_anymore utf16_surrogate unassigned unicode_8_and_above_only 

То есть мой grep прежнему рассматривает некоторые из этих недопустимых, несимвольных символов или не назначенных символов как символы (или содержащие). YMMV для других реализаций grep или других утилит.