O Vim mostra caracteres estranhos <91>, <92>

26

Ao usar o Vim sobre SSH, copiei algum conteúdo de uma página da web para minha sessão SSH / Vim e obtive o seguinte resultado:

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

Aparentemente, <91>e <92>representam ', mas como eu posso pesquisar e substituir este material? E o que isso 91/ 92significa? Como isso é codificado porque 91/ 92em ASCII significa \e [?

Jeremy S.
fonte

Respostas:

23

O conteúdo da sua página da web de origem foi reformatado demais. O texto foi, sem dúvida, suposto uso (em linha reta) aspas simples (ASCII 39/0x27, U+0027) em vez de aspas simples chaves ( U+2018e U+2019, que são 0x91 and 0x92em CP1252 (também conhecida como MS-ANSI e Windows-1252; uma codificação comum de 8 bits no Windows)) .

O Vim está mostrando os códigos hexadecimais porque eles não são válidos em qualquer codificação que o Vim esteja usando (provavelmente UTF-8). Se você estiver editando texto que já foi salvo em um arquivo, poderá recarregá-lo como CP1252 com :e ++enc=cp1252; isso deve tornar as aspas encaracoladas visíveis. Mas não há nenhuma razão real para recarregá-lo como CP1252, basta apagar os 0x91e 0x92caracteres e substituí-los por aspas simples.

Chris Johnsen
fonte
Você geralmente obtém aspas / apóstrofo a partir do conteúdo copiado do MS Word, que insere automaticamente as aspas / apóstrofo como parte do recurso "Citações inteligentes". Se sua fonte não suportar esses caracteres, você obterá um espaço vazio em vez do caractere.
lambacck
1
+1 para:e ++enc=cp1252
wfaulk 30/11/2012
@ ChrisJohnsen, Existe alguma maneira de chamar vi com uma bandeira que realiza a mesma coisa que :e ++enc=cp1252? Se eu quiser vi na linha de comando de um arquivo contendo caracteres de palavra de MS, que seria bom para ser capaz de fazê-lo em uma única etapa, em vez de vi abertura e, em seguida, carregar o arquivo com o :ecomando
Leo Simon
@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- O comando é executado antes do normal .vimrce define a fileencodingsopção (observe o final s; você também pode usar o nome mais curto fencs) para que o Vim tente o CP1252 apenas ao carregar arquivos. Isso deve funcionar para a edição única desses arquivos, mas pode causar complicações se você desejar usar essa instância do Vim para editar arquivos com outras codificações.
31416 Chris Johnsen
Obrigado !, para ser explícito, agora estou usando #vim -c"set fencs" /path/to/file
Leo Simon
27

91 e 92 são os códigos hexadecimais do apóstrofo encaracolado de abertura e fechamento (aspas simples) na versão padrão do MS Windows da codificação latin1 / ISO-8859-1, que é mais especificamente chamada cp1252 / Windows-1252 (em que cp significa código página).

Esses caracteres geralmente são inseridos por pessoas que copiam o conteúdo de documentos do Word / e-mails do Outlook como parte do recurso "Citações inteligentes". Outros caracteres problemáticos nesta página de código são hexágono 93/94, que são aspas duplas de abertura e fechamento, ponto de marcador (•) e ligadura OE (œ e Œ). Você pode ver uma lista completa dos "caracteres problemáticos", aqueles que não são mapeados diretamente na ISO-8859-1 ou UTF-8 com o mesmo código, na página da Wikipeda do cp1252 destacada em verde.

Se tudo o que você deseja é abrir o arquivo na codificação correta, use a opção ++ enc = cp1252 no comando: e:

:e ++enc=1252 filename.txt

Você pode substituir um código hexadecimal incorreto específico no Vim pelo comando substitute (: s) e uma das substituições 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 alterar os caracteres hexadecimais 91/92, você precisa:

:%s/[\x91\x92]/'/g
lambacck
fonte
Seria ótimo ter um comando bash para substituir esses caracteres em todos os arquivos no diretório. Eu vim com isso em uma rápida pesquisa no Google, sed -i "s/[\x91\x92]/\'/g" *.txtmas não funcionou.
Buttle Butkus 13/03/2013
Acabei de encontrar algo que parecia funcionar para a linha de comando. Isso localiza / substitui todos os arquivos .txt na pasta atual. Pesquise o perl antes de usar isso, no entanto, porque não tenho idéia do que os switches fazem. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus 13/03/2013
2
sed -i "s/\x92/'/g"trabalhou para mim.
Karoly Horvath 30/01
3

Use iconvpara converter o arquivo de texto de CP1252 para UTF-8 antes de abrir.

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

No Mac OS, use o seguinte:

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

Na verdade, eles representam os hexágonos 91 e 92, que na página de códigos do Windows são aspas simples de abertura e fechamento ('e' - Alt-0145 e Alt-0146).

Tente a seguinte pesquisa / substituição:

:s%/\<9[12]\>/'/g
Alex
fonte
1
Não posso reduzir a votação devido à falta de pontos, mas esse comando de substituição é tão errado que não sei por onde começar :(
lambacck
1
Isso não funciona para mim: stackoverflow.com/questions/2798398/… fornece uma solução que funciona.
Confusão
@ambacck: Eu estava assumindo que o arquivo contém as seqüências literais "91" e "92" e, nesse caso, esse comando está correto. Se estes são caracteres hexadecimais, então você está certo, precisaria do seu comando de substituição ou algo semelhante.
Alex