Questão Vim mostra caracteres estranhos <91>, <92>


enquanto usava vim sobre ssh eu copiei algum conteúdo de uma página da web para minha sessão ssh / vim e obteve o seguinte resultado

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

aparentemente <91> e <92> significa "mas como posso pesquisar e substituir essas coisas? e o que significa 91/92, como isso é codificado?

Porque 91/92 em ASCII significa \ e [

Obrigado por qualquer ajuda


22


origem




Respostas:


O conteúdo da sua página da Web de origem foi reformatado de forma excessivamente zelosa. Sem dúvida, o texto deveria usar aspas simples (em linha reta) (ASCII 39 / 0x27, U + 0027) em vez de aspas simples (U + 2018 e U + 2019, que são 0x91 e 0x92 no CP1252 (também conhecido 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 um texto que já tenha sido salvo em um arquivo, poderá recarregá-lo como CP1252 com :e ++enc=cp1252; isso deve tornar as aspas curvas visíveis. Mas não há nenhuma razão real para recarregá-lo como CP1252, apenas exclua os caracteres 0x91 e 0x92 e substitua-os por aspas simples.


22



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


91 e 92 são os códigos hexadecimais para abrir e fechar a apóstrofe (cota única) na versão padrão do MS Windows da codificação latin1 / ISO-8859-1, que é mais especificamente chamada cp1252 / Windows-1252 (onde cp significa página de código).

Esses caracteres geralmente são inseridos por pessoas copiando conteúdo de documentos do Word / e-mails do Outlook como parte do recurso "Citações inteligentes". Outros caracteres de problema nesta página de códigos são hexadecimais 93/94, que são aspas duplas abertas e próximas, ponto de marcação (•) e ligadura OE (œ e Œ). Você pode ver uma lista completa dos "personagens problemáticos", aqueles que não mapeiam diretamente para ISO-8859-1 ou UTF-8 com o mesmo código, no Página Wikipédia para cp1252 destacado em verde.

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

:e ++enc=1252 filename.txt

Você pode substituir um código hexadecimal incorreto no Vim com o comando substituto (: 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 o hexadecimal 91/92 caracteres em que você precisa fazer:

:%s/[\x91\x92]/'/g

23



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


Usar iconv para 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 isto:

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv

3





Eles, na verdade, representam hexágonos 91 e 92, que na página de código 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

-2



Eu não posso downvote devido à falta de pontos, mas este comando de substituição é tão errado eu não sei por onde começar :( - lambacck
Isso não funciona para mim: stackoverflow.com/questions/2798398/… dá uma solução que funciona. - Confusion
@lambacck: Eu estava assumindo que o arquivo contém as sequências literais "91" e "92" e, nesse caso, esse comando está correto. Se estes são caracteres hexadecimais, então você está certo, você precisaria de seu comando de substituição ou algo similar. - Alex