Vim pokazuje dziwne znaki <91>, <92>

26

Podczas korzystania z Vima przez SSH skopiowałem część zawartości ze strony internetowej do mojej sesji SSH / Vim i otrzymałem następujący wynik:

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

Najwyraźniej <91>i <92>za, 'ale jak mogę to wyszukać i wymienić? A co to znaczy 91/ 92oznacza? Jak to jest kodowane, ponieważ 91/ 92w ASCII oznacza \i [?

Jeremy S.
źródło

Odpowiedzi:

23

Treść na Twojej stronie źródłowej została nadmiernie sformatowana. Tekst został niewątpliwie ma zastosowania (prosta), apostrofów (ASCII 39/0x27, U+0027) zamiast klamrowych apostrofów ( U+2018i U+2019, które są 0x91 and 0x92w CP1252 (znany również jako MS-ANSI i windows-1252; kodującego wspólny 8-bitowy Windows)) .

Vim pokazuje ci kody szesnastkowe, ponieważ nie są poprawne w jakimkolwiek kodowaniu, którego używa Vim (prawdopodobnie UTF-8). Jeśli edytujesz tekst, który został już zapisany w pliku, możesz ponownie załadować plik jako CP1252 za ​​pomocą :e ++enc=cp1252; to powinno sprawić, że nawiasy będą widoczne. Ale nie ma żadnego powodu, aby przeładować go jako CP1252, po prostu usunąć 0x91i 0x92znaków i zastąpić je apostrofami.

Chris Johnsen
źródło
Często otrzymujesz nawiasy / apostrofy z treści skopiowanych z MS Word, która automatycznie wstawia nawiasy / apostrofy jako część funkcji „Inteligentne cytaty”. Jeśli twoja czcionka nie obsługuje tych znaków, otrzymasz po prostu puste miejsce zamiast znaku.
lambacck,
1
+1 za:e ++enc=cp1252
wfaulk
@ChrisJohnsen, Czy jest jakiś sposób na wywołanie vi z flagą, która osiąga to samo, co :e ++enc=cp1252? Jeśli chcę vi z wiersza polecenia pliku zawierającego znaki słowne MS, byłoby miło móc to zrobić w jednym kroku, zamiast otwierać vi, a następnie ładować plik za pomocą :epolecenia
Leo Simon
@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- Polecenie jest uruchamiane przed normalnym .vimrci ustawia fileencodingsopcję (zwróć uwagę na zakończenie s; możesz także użyć krótszej nazwy fencs), aby Vim spróbował CP1252 tylko podczas ładowania plików. Powinno to działać w przypadku jednorazowej edycji takich plików, ale może powodować komplikacje, jeśli chcesz użyć tego wystąpienia Vima do edycji plików z innymi kodowaniami.
Chris Johnsen
Dzięki !, żeby być szczerym, teraz używamvim -c"set fencs" /path/to/file
Leo Simon
27

91 i 92 są kodami szesnastkowymi otwartego i zamkniętego kędzierzawego apostrofu (pojedynczy cudzysłów) w domyślnej wersji MS Windows kodowania latin1 / ISO-8859-1, która jest bardziej szczegółowo nazywana cp1252 / Windows-1252 (gdzie cp oznacza kod strona).

Te znaki są najczęściej wstawiane przez osoby kopiujące treści z dokumentów Word / wiadomości e-mail programu Outlook w ramach funkcji „Inteligentne cytaty”. Inne znaki problemowe na tej stronie kodowej to hex 93/94, które otwierają i zamykają podwójne cudzysłowy, punktor (•) i ligatura OE (œ i Œ). Możesz zobaczyć pełną listę „znaków problemowych”, które nie mapują bezpośrednio na ISO-8859-1 lub UTF-8 z tym samym kodem, na stronie Wikipeda dla cp1252 podświetlonej na zielono.

Jeśli wszystko, co chcesz, to otworzyć plik w prawidłowym kodowaniu, użyj opcji ++ enc = cp1252 dla polecenia: e:

:e ++enc=1252 filename.txt

Możesz wymienić konkretny zły kod szesnastkowy w Vimie za pomocą polecenia substitute (: s) i jednej z podstawień kodu:

\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

Aby zmienić szesnastkowe 91/92 znaki, musisz:

:%s/[\x91\x92]/'/g
lambacck
źródło
Byłoby wspaniale mieć polecenie bash zastępujące te znaki we wszystkich plikach w katalogu. Wymyśliłem to z szybkiego wyszukiwania w Google, sed -i "s/[\x91\x92]/\'/g" *.txtale to nie zadziałało.
Buttle Butkus
Właśnie znalazłem coś, co wydawało się działać w wierszu poleceń. Znajduje / zastępuje wszystkie pliki .txt w bieżącym folderze. Reasearch perl przed użyciem tego, ponieważ nie mam pojęcia, co robią przełączniki. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus
2
sed -i "s/\x92/'/g"pracował dla mnie.
Karoly Horvath,
3

Służy iconvdo konwersji pliku tekstowego z CP1252 na UTF-8 przed otwarciem.

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

W systemie Mac OS użyj tego:

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv
Ignacio Vazquez-Abrams
źródło
-3

W rzeczywistości oznaczają szesnastki 91 i 92, które na stronie kodowej Windows nawijają i zamykają pojedyncze cudzysłowy ('i' - Alt-0145 i Alt-0146).

Spróbuj wyszukać / zamień:

:s%/\<9[12]\>/'/g
Alex
źródło
1
Nie mogę przegłosować z powodu braku punktów, ale to polecenie zamiany jest tak błędne, że nie wiem od czego zacząć :(
lambacck
1
Dla mnie to nie działa: stackoverflow.com/questions/2798398/... daje rozwiązanie, które działa.
Zamieszanie,
@lambacck: Zakładałem, że plik zawiera dosłowne ciągi znaków „91” i „92”, w takim przypadku to polecenie jest poprawne. Jeśli są to znaki szesnastkowe, masz rację, potrzebujesz polecenia zamiany lub czegoś podobnego.
Alex