Vim montre des caractères étranges <91>, <92>

26

En utilisant Vim sur SSH, j'ai copié du contenu d'une page Web vers ma session SSH / Vim et j'ai obtenu le résultat suivant:

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

Apparemment <91>et <92>représenter 'mais comment puis-je rechercher et remplacer ce genre de choses? Et qu'est-ce que 91/ ça 92veut dire? Comment est-ce codé parce que 91/ 92en ASCII signifie \et [?

Jeremy S.
la source

Réponses:

23

Le contenu de votre page Web source a été trop reformaté. Le texte a été sans aucun doute censé utiliser (droite) guillemets simples (ASCII 39/0x27, U+0027) au lieu de guillemets simples bouclés ( U+2018et U+2019, qui sont 0x91 and 0x92en CP1252 (également connu sous le nom de MS-ANSI et WINDOWS-1252, un codage 8-bit commun sous Windows)) .

Vim vous montre les codes hexadécimaux car ils ne sont pas valides dans le codage que Vim utilise (probablement UTF-8). Si vous modifiez du texte qui a déjà été enregistré dans un fichier, vous pouvez recharger le fichier en tant que CP1252 avec :e ++enc=cp1252; cela devrait rendre les guillemets bouclés visibles. Mais il n'y a aucune raison de le recharger comme CP1252, il suffit de supprimer les 0x91et les 0x92caractères et les remplacer par des guillemets simples.

Chris Johnsen
la source
Vous obtenez souvent les guillemets / apostrophe bouclés du contenu copié à partir de MS Word qui insère automatiquement les guillemets / apostrophe bouclés dans le cadre de la fonctionnalité "Citations intelligentes". Si votre police ne prend pas en charge ces caractères, vous obtiendrez simplement un espace vide au lieu du caractère.
lambacck
1
+1 pour:e ++enc=cp1252
wfaulk
@ChrisJohnsen, Existe-t-il un moyen d'appeler vi avec un indicateur qui accomplit la même chose que :e ++enc=cp1252? Si je veux vi à partir de la ligne de commande un fichier contenant des caractères MS Word, ce serait bien de pouvoir le faire en une seule étape, plutôt que d'ouvrir vi puis de charger le fichier avec la :ecommande
Leo Simon
@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- La commande s'exécute avant la normale .vimrcet définit l' fileencodingsoption (notez la fin s; vous pouvez également utiliser le nom plus court fencs) afin que Vim n'essaye que CP1252 lors du chargement des fichiers. Cela devrait fonctionner pour l'édition unique de ces fichiers, mais cela peut entraîner des complications si vous souhaitez utiliser cette instance de Vim pour éditer des fichiers avec d'autres encodages.
Chris Johnsen
Merci !, pour être explicite, j'utilise maintenantvim -c"set fencs" /path/to/file
Leo Simon
27

91 et 92 sont les codes hexadécimaux pour l'apostrophe bouclée ouverte et fermée (guillemet simple) dans la version par défaut MS Windows de l'encodage latin1 / ISO-8859-1, qui est plus spécifiquement appelé cp1252 / Windows-1252 (où cp représente le code page).

Ces caractères sont le plus souvent insérés par des personnes qui copient du contenu à partir de documents Word / e-mails Outlook dans le cadre de la fonctionnalité "Citations intelligentes". Les autres caractères problématiques de cette page de codes sont l'hex 93/94 qui sont des guillemets doubles ouverts et fermés, une puce (•) et une ligature OE (œ et Œ). Vous pouvez voir une liste complète des "caractères problématiques", ceux qui ne correspondent pas directement à ISO-8859-1 ou UTF-8 avec le même code, sur la page Wikipeda pour cp1252 surlignée en vert.

Si tout ce que vous voulez est d'ouvrir le fichier dans l'encodage correct, utilisez l'option ++ enc = cp1252 pour la commande: e:

:e ++enc=1252 filename.txt

Vous pouvez remplacer un mauvais code hexadécimal particulier dans Vim avec la commande de substitution (: s) et l'une des substitutions de code:

\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

Pour modifier les caractères hex 91/92, vous devez faire:

:%s/[\x91\x92]/'/g
lambacck
la source
Ce serait formidable d'avoir une commande bash pour remplacer ces caractères dans tous les fichiers du répertoire. J'ai trouvé cela à partir d'une recherche rapide sur Google, sed -i "s/[\x91\x92]/\'/g" *.txtmais cela n'a pas fonctionné.
Buttle Butkus
Je viens de trouver quelque chose qui semblait fonctionner pour la ligne de commande. Cela permet de trouver / remplacer tous les fichiers .txt du dossier actuel. Cherchez perl avant de l'utiliser, car je n'ai aucune idée de ce que font les commutateurs. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus
2
sed -i "s/\x92/'/g"travaillé pour moi.
Karoly Horvath
3

Utilisez iconvpour convertir le fichier texte de CP1252 en UTF-8 avant de l'ouvrir.

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

Sur Mac OS, utilisez ceci:

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

Ils représentent en fait les hex 91 et 92, qui dans la page de code Windows ouvrent et ferment les guillemets simples ('et' - Alt-0145 et Alt-0146).

Essayez la recherche / remplacement suivante:

:s%/\<9[12]\>/'/g
Alex
la source
1
Je ne peux pas downvote en raison du manque de points, mais cette commande de substitution est si mauvaise que je ne sais pas par où commencer :(
lambacck
1
Cela ne fonctionne pas pour moi: stackoverflow.com/questions/2798398/… donne une solution qui fonctionne.
Confusion
@lambacck: Je supposais que le fichier contient les chaînes littérales "91" et "92", et dans ce cas, cette commande est correcte. Si ce sont des caractères hexadécimaux, alors vous avez raison, vous aurez besoin de votre commande de substitution ou quelque chose de similaire.
Alex