Vim muestra caracteres extraños <91>, <92>

26

Mientras usaba Vim sobre SSH, copié parte del contenido de una página web en mi sesión de SSH / Vim y obtuve el siguiente resultado:

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

Aparentemente <91>y <92>defender, 'pero ¿cómo puedo buscar y reemplazar estas cosas? ¿Y qué significa eso 91/ 92? ¿Cómo se codifica esto porque 91/ 92en ASCII significa \y [?

Jeremy S.
fuente

Respuestas:

23

El contenido de su página web de origen se ha reformateado demasiado. El texto fue, sin duda, supone que el uso (recta) entre comillas simples (ASCII 39/0x27, U+0027) en lugar de comillas simples rizado ( U+2018y U+2019, que son 0x91 and 0x92en CP1252 (también conocida como MS-ANSI y WINDOWS-1252; un común codificación de 8 bits en Windows)) .

Vim le muestra los códigos hexadecimales porque no son válidos en la codificación que Vim esté utilizando (probablemente UTF-8). Si está editando texto que ya se ha guardado en un archivo, puede volver a cargar el archivo como CP1252 con :e ++enc=cp1252; Esto debería hacer visibles las comillas rizadas. Pero no hay ninguna razón real para recargar como CP1252, basta con borrar las 0x91y los 0x92personajes y reemplazarlos con comillas simples.

Chris Johnsen
fuente
A menudo, obtienes las comillas rizadas / apóstrofo del contenido copiado de MS Word que inserta automáticamente las comillas rizadas / apóstrofo como parte de la función "Comillas inteligentes". Si su fuente no admite esos caracteres, solo obtendrá un espacio vacío en lugar del carácter.
lambacck
1
+1 para:e ++enc=cp1252
wfaulk
@ChrisJohnsen, ¿Hay alguna forma de llamar a vi con una bandera que logre lo mismo que :e ++enc=cp1252? Si quiero vi desde la línea de comando un archivo que contenga caracteres de MS Word, sería bueno poder hacerlo en un solo paso, en lugar de abrir vi y luego cargar el archivo con el :ecomando
Leo Simon
@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- El comando se ejecuta antes de lo normal .vimrcy establece la fileencodingsopción (tenga en cuenta el final s; también puede usar el nombre más corto fencs) para que Vim solo intente CP1252 al cargar archivos. Esto debería funcionar para la edición única de dichos archivos, pero puede causar complicaciones si desea utilizar esa instancia de Vim para editar archivos con otras codificaciones.
Chris Johnsen
Gracias !, para ser explícito, ahora estoy usandovim -c"set fencs" /path/to/file
Leo Simon
27

91 y 92 son los códigos hexadecimales para abrir y cerrar el apóstrofe rizado (comilla simple) en la versión predeterminada de MS Windows de la codificación latin1 / ISO-8859-1, que se llama más específicamente cp1252 / Windows-1252 (donde cp significa código página).

La mayoría de las veces, las personas que copian contenido de documentos de Word / correos electrónicos de Outlook insertan estos caracteres como parte de la función "Citas inteligentes". Otros caracteres problemáticos en esta página de códigos son hexadecimales 93/94, que son comillas dobles de apertura y cierre, viñeta (•) y ligadura OE (œ y Œ). Puede ver una lista completa de los "caracteres problemáticos", los que no se asignan directamente a ISO-8859-1 o UTF-8 con el mismo código, en la página de Wikipeda para cp1252 resaltada en verde.

Si todo lo que desea es abrir el archivo con la codificación correcta, use la opción ++ enc = cp1252 para el comando: e:

:e ++enc=1252 filename.txt

Puede reemplazar un código hexadecimal incorrecto en particular en Vim con el comando sustituto (: s) y una de las sustituciones de código:

\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

Para cambiar los caracteres hexadecimales 91/92 que necesita hacer:

:%s/[\x91\x92]/'/g
lambacck
fuente
Sería genial tener un comando bash para reemplazar esos caracteres en todos los archivos en el directorio. Se me ocurrió esto mediante una búsqueda rápida en Google, sed -i "s/[\x91\x92]/\'/g" *.txtpero no funcionó.
Buttle Butkus
Acabo de encontrar algo que parecía funcionar para la línea de comando. Esto busca / reemplaza todos los archivos .txt en la carpeta actual. Sin embargo, investigue Perl antes de usar esto, porque no tengo idea de lo que hacen los interruptores. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus
2
sed -i "s/\x92/'/g"trabajó para mi.
Karoly Horvath
3

Use iconvpara convertir el archivo de texto de CP1252 a UTF-8 antes de abrirlo.

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

En Mac OS use esto:

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

En realidad, representan los hex 91 y 92, que en la página de códigos de Windows son comillas simples de apertura y cierre ('y' - Alt-0145 y Alt-0146).

Pruebe la siguiente búsqueda / reemplazo:

:s%/\<9[12]\>/'/g
Alex
fuente
1
No puedo votar en contra debido a la falta de puntos, pero este comando de sustitución es tan incorrecto que no sé por dónde empezar :(
lambacck
1
Esto no funciona para mí: stackoverflow.com/questions/2798398/… ofrece una solución que funciona.
Confusión
@lambacck: estaba asumiendo que el archivo contiene las cadenas literales "91" y "92", y en ese caso este comando es correcto. Si se trata de caracteres hexadecimales, tiene razón, necesitaría su comando de sustitución o algo similar.
Alex