Vim zeigt seltsame Zeichen <91>, <92>

26

Bei der Verwendung von Vim über SSH habe ich einige Inhalte von einer Webseite in meine SSH / Vim-Sitzung kopiert und folgendes Ergebnis erhalten:

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

Anscheinend <91>und dafür <92>stehen, 'aber wie kann ich dieses Zeug suchen und ersetzen? Und was bedeutet , dass 91/ 92das? Wie ist das denn verschlüsselt 91/ 92in ASCII gemeint \und [?

Jeremy S.
quelle

Antworten:

23

Der Inhalt Ihrer Quellwebseite wurde zu stark umformatiert. Der Text wurde zweifellos soll (gerade) einfache Anführungszeichen (ASCII 39/0x27, U+0027) anstelle von geschweiften Apostrophe ( U+2018und U+2019, die sind 0x91 and 0x92in CP1252 (auch als MS-ANSI und WINDOWS-1252 bekannt, eine gemeinsame 8-Bit - Codierung unter Windows)) .

Vim zeigt Ihnen die Hex-Codes an, da diese in der von Vim verwendeten Codierung (wahrscheinlich UTF-8) nicht gültig sind. Wenn Sie Text bearbeiten, der bereits in einer Datei gespeichert wurde, können Sie die Datei als CP1252 mit :e ++enc=cp1252; Dies sollte die geschweiften Anführungszeichen sichtbar machen. Aber es gibt keinen wirklichen Grund , es als CP1252 neu zu laden, löschen Sie einfach die 0x91und 0x92Zeichen und ersetzen sie durch einfache Anführungszeichen.

Chris Johnsen
quelle
Sie erhalten häufig die geschweiften Anführungszeichen / Apostrophe aus Inhalten, die aus MS Word kopiert wurden, wobei die geschweiften Anführungszeichen / Apostrophe automatisch als Teil der Funktion "Intelligente Anführungszeichen" eingefügt werden. Wenn Ihre Schriftart diese Zeichen nicht unterstützt, wird anstelle des Zeichens nur ein Leerzeichen angezeigt.
Lambacck
1
+1 für:e ++enc=cp1252
wfaulk
@ ChrisJohnsen, gibt es eine Möglichkeit, vi mit einem Flag aufzurufen, das dasselbe bewirkt wie :e ++enc=cp1252? Wenn ich von der Kommandozeile aus eine Datei mit MS-Word-Zeichen vi haben möchte, wäre es schön, wenn ich das in einem Schritt tun könnte, anstatt vi zu öffnen und dann die Datei mit dem :eKommando zu laden
Leo Simon,
@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- Der Befehl wird vor dem normalen ausgeführt .vimrcund legt die fileencodingsOption fest (beachten Sie die Endung s; Sie können auch den kürzeren Namen verwenden fencs), sodass Vim CP1252 nur beim Laden von Dateien versucht. Dies sollte für die einmalige Bearbeitung solcher Dateien funktionieren, kann jedoch zu Komplikationen führen, wenn Sie diese Instanz von Vim zum Bearbeiten von Dateien mit anderen Codierungen verwenden möchten.
Chris Johnsen
Danke !, um genau zu sein, ich verwende jetztvim -c"set fencs" /path/to/file
Leo Simon
27

91 und 92 sind die Hex-Codes für das Öffnen und Schließen von geschweiften Apostrophen (einfache Anführungszeichen) in der MS Windows-Standardversion der latin1 / ISO-8859-1-Codierung, die genauer gesagt cp1252 / Windows-1252 heißt (wobei cp für Code steht) Seite).

Diese Zeichen werden am häufigsten von Personen eingefügt, die im Rahmen der Funktion "Intelligente Anführungszeichen" Inhalte aus Word-Dokumenten / Outlook-E-Mails kopieren. Andere Problemzeichen in dieser Codepage sind Hex 93/94, offene und geschlossene doppelte Anführungszeichen, Aufzählungszeichen (•) und OE-Ligatur (œ und Œ). Eine vollständige Liste der "Problemzeichen", die nicht mit demselben Code direkt in ISO-8859-1 oder UTF-8 abgebildet werden, finden Sie auf der Wikipeda-Seite für cp1252, die grün hervorgehoben ist.

Wenn Sie die Datei nur in der richtigen Codierung öffnen möchten, verwenden Sie die Option ++ enc = cp1252 für den Befehl: e:

:e ++enc=1252 filename.txt

Sie können einen bestimmten ungültigen Hex-Code in Vim durch den (die) Ersatzbefehl (e) und eine der folgenden Code-Ersetzungen ersetzen:

\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

Um die hexadezimalen 91/92 Zeichen in zu ändern, müssen Sie Folgendes tun:

:%s/[\x91\x92]/'/g
Lambacck
quelle
Es wäre toll, einen bash-Befehl zu haben, um diese Zeichen in allen Dateien im Verzeichnis zu ersetzen. Ich habe mir das über eine schnelle Google-Suche ausgedacht, sed -i "s/[\x91\x92]/\'/g" *.txtaber es hat nicht funktioniert.
Buttle Butkus
Ich habe gerade etwas gefunden, das für die Befehlszeile zu funktionieren schien. Dadurch werden alle TXT-Dateien im aktuellen Ordner gesucht / ersetzt. Suchen Sie jedoch vorher nach Perl, da ich keine Ahnung habe, was die Schalter bewirken. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus
2
sed -i "s/\x92/'/g"arbeitete für mich.
Karoly Horvath
3

Verwenden Sie iconvdiese Option, um die Textdatei vor dem Öffnen von CP1252 nach UTF-8 zu konvertieren.

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

Verwenden Sie unter Mac OS Folgendes:

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv
Ignacio Vazquez-Abrams
quelle
-3

Sie stehen eigentlich für hex 91 und 92, die in der Windows-Codepage geschweifte öffnende und schließende einfache Anführungszeichen sind ('und' - Alt-0145 und Alt-0146).

Versuchen Sie folgendes Suchen / Ersetzen:

:s%/\<9[12]\>/'/g
Alex
quelle
1
Ich kann wegen fehlender Punkte nicht abstimmen, aber dieser Ersetzungsbefehl ist so falsch, dass ich nicht weiß, wo ich anfangen soll :(
Lambacck
1
Das funktioniert bei mir nicht: stackoverflow.com/questions/2798398/… gibt eine Lösung, die funktioniert.
Verwirrung
@lambacck: Ich nahm an, dass die Datei die Literalzeichenfolgen "91" und "92" enthält, und in diesem Fall ist dieser Befehl korrekt. Wenn es sich um Hexadezimalzeichen handelt, haben Sie Recht, Sie benötigen Ihren Ersetzungsbefehl oder etwas Ähnliches.
Alex