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

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

One Solution collect form web for “Как создать строку с недопустимыми символами юникода, в 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 или других утилит.

  • Как тихо получить пустую строку из шаблона шара без совпадений
  • Когда используется ~ + полезно?
  • Где zsh и mksh несовместимы с bash?
  • zsh: как получить расширение файла, работающее в заявлении на печать
  • Как я могу применить `cut` к нескольким файлам, а затем« вставить »результаты?
  • Как установить правила автозаполнения Zsh для второго аргумента (функции) в правила существующей команды?
  • Команда zsh git auto-complete добавляет дополнительное происхождение к имени ветки git
  • Избегание «BASH-isms» в сценариях оболочки
  • Как переключиться на root и использовать те же точечные файлы, что и мой обычный пользователь?
  • Экран: «Невозможно выполнить exec / my / path / to / zsh» с локальной оболочкой
  • автозаполненные названные каталоги
  • Linux и Unix - лучшая ОС в мире.