Vim показывает странные символы <91>, <92>

26

При использовании Vim поверх SSH я скопировал некоторый контент с веб-страницы в мой сеанс SSH / Vim и получил следующий результат:

SIZE=`df -h|grep $DISC|awk <91>{print $2}<92>`

Видимо <91>и <92>стоит, 'но как я могу найти и заменить этот материал? А что значит , что 91/ 92значит? Как это закодировано, потому что 91/ 92в ASCII означают \и [?

Джереми С.
источник

Ответы:

23

Содержимое вашей исходной веб-страницы было переформатировано. В тексте, несомненно, предполагалось использовать (прямые) одинарные кавычки (ASCII 39/0x27, U+0027) вместо фигурных одинарных кавычек ( U+2018и U+2019, которые 0x91 and 0x92в CP1252 (также известные как MS-ANSI и WINDOWS-1252; обычная 8-битная кодировка в Windows)) ,

Vim показывает вам шестнадцатеричные коды, потому что они недопустимы в любой кодировке, используемой Vim (возможно, UTF-8). Если вы редактируете текст, который уже был сохранен в файле, вы можете перезагрузить файл как CP1252 с помощью :e ++enc=cp1252; это должно сделать фигурные кавычки видимыми. Но нет никакой реальной причины , чтобы перезагрузить его как CP1252, просто удалите 0x91и 0x92символы , и заменить их на одиночные кавычки.

Крис Джонсен
источник
Вы часто получаете фигурные кавычки / апостроф из содержимого, скопированного из MS Word, который автоматически вставляет фигурные кавычки / апостроф как часть функции «Умные цитаты». Если ваш шрифт не поддерживает эти символы, вы просто получите пустой пробел вместо символа.
lambacck
1
+1 за:e ++enc=cp1252
wfaulk
@ChrisJohnsen, есть ли способ вызвать vi с флагом, который выполняет то же самое, что и :e ++enc=cp1252? Если я хочу в vi из командной строки файл, содержащий символы MS Word, было бы неплохо сделать это за один шаг, вместо того, чтобы открывать vi и затем загружать файл с помощью :eкоманды
Лео Симон
@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- команда запускается раньше обычного .vimrcи задает fileencodingsпараметр (обратите внимание на окончание s; вы также можете использовать более короткое имя fencs), чтобы Vim использовал только CP1252 при загрузке файлов. Это должно работать для одноразового редактирования таких файлов, но это может вызвать сложности, если вы хотите использовать этот экземпляр Vim для редактирования файлов с другими кодировками.
Крис Джонсен
Спасибо !, чтобы быть ясным, я сейчас используюvim -c"set fencs" /path/to/file
Лео Саймон
27

91 и 92 - это шестнадцатеричные коды для открытого и закрытого фигурного апострофа (одинарные кавычки) в стандартной версии кодировки latin1 / ISO-8859-1 для MS Windows, которая более конкретно называется cp1252 / Windows-1252 (где cp обозначает код страница).

Эти символы чаще всего вставляются людьми, копирующими содержимое из документов Word / электронных писем Outlook, как часть функции «Умные цитаты». Другими символами проблемы в этой кодовой странице являются шестнадцатеричные 93/94, которые открывают и закрывают двойные кавычки, точка маркера (•) и лигатура OE (œ и Œ). Вы можете увидеть полный список «проблемных символов», которые не отображаются непосредственно в ISO-8859-1 или UTF-8 с тем же кодом, на странице Википедии для cp1252, выделенной зеленым цветом.

Если все, что вам нужно, это открыть файл в правильной кодировке, тогда используйте параметр ++ enc = cp1252 для команды: e:

:e ++enc=1252 filename.txt

Вы можете заменить определенный неправильный шестнадцатеричный код в Vim командой замены (: s) и одной из замен кода:

\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

Чтобы изменить шестнадцатеричные символы 91/92, вам нужно сделать:

:%s/[\x91\x92]/'/g
lambacck
источник
Было бы здорово иметь команду bash для замены этих символов во всех файлах в каталоге. Я пришел с этим из быстрого поиска в Google, sed -i "s/[\x91\x92]/\'/g" *.txtно это не сработало.
Баттл Буткус
Я только что нашел что-то, что, похоже, работает для командной строки. Это находит / заменяет все файлы .txt в текущей папке. Изучите perl, прежде чем использовать это, потому что я понятия не имею, что делают переключатели. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Баттл Буткус
2
sed -i "s/\x92/'/g"работал на меня.
Кароли Хорват
3

Используйте iconvдля преобразования текстового файла из CP1252 в UTF-8 перед открытием.

iconv -f cp1252 -t utf8 inputfile.csv > outputfile.csv

На Mac OS используйте это:

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv
Игнасио Васкес-Абрамс
источник
-3

На самом деле они обозначают шестнадцатеричные 91 и 92, которые в кодовой странице Windows вьются открывать и закрывать одинарные кавычки ('и' - Alt-0145 и Alt-0146).

Попробуйте следующий поиск / замена:

:s%/\<9[12]\>/'/g
Alex
источник
1
Я не могу понизить голос из-за нехватки очков, но эта команда замены настолько ошибочна, что я не знаю, с чего начать :(
lambacck
1
Это не работает для меня: stackoverflow.com/questions/2798398/… дает решение, которое работает.
Путаница
@lambacck: я предполагал, что файл содержит буквенные строки «91» и «92», и в этом случае эта команда верна. Если это шестнадцатеричные символы, то вы правы, вам нужна команда подстановки или что-то подобное.
Алекс