$ printf '\xef\xbb\xbf' | uconv -x any-name
\N{ZERO WIDTH NO-BREAK SPACE}
Это символ (U + FEFF, закодированный в 3 байта в UTF-8), который также используется как отметка порядка байтов. В любом случае этот символ не найден в MS-ANSI (неправильное имя, которое иногда дается windows-1252, надмножество iso8859-1), поэтому не может быть преобразовано в него.
Спецификации используются (в начале некоторого текста), чтобы отличать UTF16-LE от UTF16-BE (или других небайтовых кодировок, на которые влияет порядок байтов ЦП). Это не имеет смысла в UTF-8, где нет неоднозначности порядка байтов, это имело бы еще меньше смысла в windows-1252, который представляет собой кодировку однобайтовых символов. Как «неразрывный пробел нулевой ширины», он также невидим и не имеет свойства разделения слов, как у символа «пробела нулевой ширины», поэтому, вероятно, его можно полностью удалить.
С zsh
, bash
или ksh93
:
sed $'s/\ufeff//g' < input | iconv -t windows-1252
С некоторыми реализациями iconv
вы также можете использовать:
iconv -t windows-1252//translit < input
// транслит
прибегает к приближению, когда текст не может быть точно переведен. В этом случае он просто удаляет символ U + FEFF.
$ printf '\xef\xbb\xbf\x38\x3a\x6e\x61\x09\x38\x3a' |
iconv -t windows-1252//translit | hd
00000000 38 3a 6e 61 09 38 3a |8:na.8:|
00000007
Здесь важно отметить тег вопроса. Это поведение характерно для терминала GNOME и любых других эмуляторов терминала, созданных на основе libvte. Вы не увидите этого ни в Xterm, ни в Unicode RXVT, ни в эмуляторе терминала, встроенном в ядро Linux, ни в консоли FreeBSD.
В общем происходит вот что.
clear
просматривает terminfo/termcap и выдает соответствующие управляющие последовательности. E3
it, она сначала записывает ее. Это выдает управляющие последовательности для очистки буфера прокрутки. Это и история, стоящая за этим, подробно задокументированы в странице руководства Dickey ncurses для команды clear
. clear
для очистки видимого экрана. putty
определяет E3=\E[3J
, которая является управляющей последовательностью расширения Xterm. pcvtxx
консоли NetBSD является одной из многих, определяющих clear=\E[H\E[J
или что-то подобное.Это две обычные управляющие последовательности ECMA -48. H
(CUP )устанавливает курсор в исходное положение. 0
J
(ED 0 )или просто CSI J
стирает от текущей позиции курсора до конца экрана. 2
J
(ED 2 )стирает весь экран. 3
J
(ED 3 )стирает буфер прокрутки. Что касается терминала GNOME, в частности:
gnome
, но некоторые люди ошибочно оставляют его равным xterm
. gnome
terminfo не определяет возможность E3
, и на многих системах — до сих пор! - то же самое относится и к записи xterm
, поскольку она не просочилась из Dickey terminfo . Итак, clear
просто записывает содержимое возможности clear
. clear
для этих записей terminfo представляет собой управляющие последовательности для возврата курсора в исходное положение с последующим стиранием всего экрана. VteTerminalPrivate::seq_clear_screen()
функции . Вместо этого libvte прокручивает экран вниз на пустые строки всего экрана и перемещает позицию курсора на первую из этих пустых строк. Вот почему вы видите то, что видите. libvte не стирает весь экран, когда ему говорят. Скорее, он делает что-то, что имеет внешнее сходство с этим, до тех пор, пока вы не сделаете в точности то, что здесь сделал вопрошающий :прокрутите окно терминала назад, чтобы посмотреть на буфер прокрутки назад. Тогда разница очевидна.
На других эмуляторах терминала, таких как Xterm и Unicode RXVT,управляющая последовательность ED 2 действительно стирает экран, стирая каждую позицию на экране сверху вниз и не изменяя буфер прокрутки. Но в эмуляторах терминала libvte он просто подталкивает текущий экран вверх в буфер прокрутки и добавляет пустые строки на один экран. Предыдущее содержимое экрана не стирается, а перемещается в буфер обратной прокрутки.
И если вы запустите команду clear
дважды, она добавит два пустых строки на экране. Если ваш буфер обратной прокрутки достаточно велик, вы все еще можете найти исходное содержимое экрана, просто выше в буфере прокрутки.
Похоже, терминал не в нормальном состоянии после прерывания программы. Попробуйте ввести «сброс», чтобы вернуть его в нормальное состояние.