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, який автоматично вставляє фігурні цитати / апостроф у рамках функції "Розумні котирування". Якщо ваш шрифт не підтримує цих символів, ви просто отримаєте порожнє місце замість символу.
ламбак

1
+1 для:e ++enc=cp1252
wfaulk

@ChrisJohnsen, Чи є спосіб зателефонувати vi із прапором, який виконує те саме, що і :e ++enc=cp1252? Якщо я хочу вивести з командного рядка файл, що містить символи слова MS, було б непогано мати можливість це зробити за один крок, а не відкривати 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 - це шістнадцятковий код для відкритого і закритого фігурного апострофа (одинарна цитата) у версії MS Windows за замовчуванням кодування latin1 / ISO-8859-1, яка більш конкретно називається cp1252 / Windows-1252 (де cp означає код сторінки).

Ці символи найчастіше вставляються людьми, що копіюють вміст з документів Word / E-mail Outlook, як частину функції "Розумні котирування". Інші проблемні символи на цій кодовій сторінці - це шістнадцятковий номер 93/94, який є відкритими та закритими подвійними лапками, пунктом (•) та OE-лігатурою (œ і Œ). Повний список "проблемних символів", тих, які не відображаються безпосередньо в ISO-8859-1 або UTF-8 з тим самим кодом, ви можете побачити на сторінці Wikipeda для 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

Було б чудово мати команду bash для заміни цих символів у всіх файлах каталогу. Я придумав це з швидкого пошуку в Google, sed -i "s/[\x91\x92]/\'/g" *.txtале це не спрацювало.
Buttle Butkus

Я просто знайшов щось, що, здавалося, працює для командного рядка. Це знайде / замінить усі .txt файли у поточній папці. Повторіть пошук перл перед тим, як використовувати це, тому що я не маю уявлення, що роблять комутатори. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus

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

1
Я не можу підкреслити через відсутність очок, але ця команда підстановки настільки помилкова, що я не знаю з чого почати :(
lambacck

1
Це не працює для мене: stackoverflow.com/questions/2798398/… дає рішення, яке працює.
Плутанина

@lambacck: Я припускав, що файл містить буквальні рядки "91" і "92", і в цьому випадку ця команда є правильною. Якщо це шістнадцяткові символи, то ви праві, вам знадобиться ваша команда підстановки чи щось подібне.
Алекс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.