verificador de arquivo de origem ASCII

4

Para documentação oficial do Ubuntu em que os arquivos em inglês de origem estão em docbook xml, há um requisito de caracteres somente em ASCII. Nós usamos uma linha de comando "verificador" (veja aqui ).

grep --color='auto' -P -n "[\x80-\xFF]" *.xml

No entanto, o comando tem uma falha, aparentemente não em todos os computadores, ele perde algumas linhas com caracteres não-ASCII, resultando potencialmente em um falso O.K. resultado.

Alguém tem uma sugestão melhor para uma linha de comando do verificador ASCII?

Pessoas interessadas podem considerar usar este arquivo (arquivo de texto, não um arquivo xml docbook) como um caso de teste. As três primeiras linhas com caracteres não ASCII são as linhas 9, 14 e 18. As linhas 14 e 18 foram perdidas no cheque:

$ grep --color='auto' -P -n "[\x80-\xFF]" install.en.txt | head -13
9:Appendix F, GNU General Public License.
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
394:1.1.1. Sponsorship by Canonical
402:1.2. What is Debian?
456:1.2.1. Ubuntu and Debian
461:1.2.1.1. Package selection
475:1.2.1.2. Releases
501:1.2.1.3. Development community
520:1.2.1.4. Freedom and Philosophy
534:1.2.1.5. Ubuntu and other Debian derivatives
555:1.3. What is GNU/Linux?
    
por Doug Smythies 06.02.2016 / 22:54

3 respostas

4

Se você deseja procurar caracteres não-ASCII, talvez seja necessário inverter a pesquisa para excluir caracteres ASCII:

grep -Pn '[^\x00-\x7F]'

Por exemplo:

$ curl https://help.ubuntu.com/16.04/installation-guide/amd64/install.en.txt -s | grep -nP '[^\x00-\x7F]' | head
9:Appendix F, GNU General Public License.
14:(codename "‘Xenial Xerus’"), for the 64-bit PC ("amd64") architecture. It also
18:━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
368:  • Ubuntu will always be free of charge, and there is no extra fee for the "
372:  • Ubuntu includes the very best in translations and accessibility
376:  • Ubuntu is shipped in stable and regular release cycles; a new release will
380:  • Ubuntu is entirely committed to the principles of open source software

Nas linhas 9, 330, 337 e 359, caracteres de espaço não quebráveis Unicode estão presentes.

A saída específica que você obtém talvez seja devido ao suporte de grep para o UTF-8. Para uma localidade Unicode, alguns desses caracteres podem comparar a um caractere ASCII normal. Forçar a localidade C mostrará os resultados esperados nesse caso:

$ LANG=C grep -Pn '[\x80-\xFF]' install.en.txt| head
9:Appendix F, GNU General Public License.
14:(codename "‘Xenial Xerus’"), for the 64-bit PC ("amd64") architecture. It also
18:━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
368:  • Ubuntu will always be free of charge, and there is no extra fee for the "
372:  • Ubuntu includes the very best in translations and accessibility
376:  • Ubuntu is shipped in stable and regular release cycles; a new release will
380:  • Ubuntu is entirely committed to the principles of open source software

$ LANG=en_GB.UTF-8 grep -Pn '[\x80-\xFF]' install.en.txt| head
9:Appendix F, GNU General Public License.
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
394:1.1.1. Sponsorship by Canonical
402:1.2. What is Debian?
456:1.2.1. Ubuntu and Debian
461:1.2.1.1. Package selection
475:1.2.1.2. Releases
501:1.2.1.3. Development community
    
por muru 07.02.2016 / 07:51
4

Você pode imprimir todas as linhas não-ASCII de um arquivo usando o meu script Python 3 que estou hospedando no GitHub aqui:

GitHub: ByteCommander / verificação de codificação

Você pode clonar ou baixar o repositório inteiro ou simplesmente salvar o arquivo encoding-check e torná-lo executável usando chmod +x encoding-check .

Depois, você pode executá-lo assim, com o arquivo a ser verificado apenas como argumento:

  • ./encoding-check FILENAME se estiver localizado em seu diretório de trabalho atual ou ...
  • /path/to/encoding-check FILENAME se estiver localizado em /path/to/ ou ...
  • encoding-check FILENAME se estiver localizado em um diretório que faça parte da variável de ambiente $PATH , ou seja, /usr/local/bin ou ~/bin .

Sem argumentos opcionais, ele imprimirá cada linha e seu número onde encontrar caracteres não-ASCII. Finalmente, há uma linha de resumo que informa quantas linhas o arquivo tinha no total e quantas delas continham caracteres não-ASCII.

Este método é garantido para decodificar corretamente todos os caracteres ASCII e detectar tudo o que definitivamente não é ASCII.

Veja um exemplo executado em um arquivo contendo as primeiras 20 linhas do seu dado install.en.txt :

$ ./encoding-check install-first20.en.txt
     9: Appendix��F, GNU General Public License.
    14: (codename "���Xenial Xerus���"), for the 64-bit PC ("amd64") architecture. It also
    18: ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
--------------------------------------------------------------------------------
20 lines in 'install-first20.en.txt', thereof 3 lines with non-ASCII characters.

Mas o script tem alguns argumentos adicionais para ajustar a codificação verificada e o formato de saída. Veja a ajuda e experimente-as:

$ encoding-check -h
usage: encoding-check [-h] [-e ENCODING] [-s | -c | -l] [-m] [-w] [-n] [-f N]
                     [-t]
                     FILE [FILE ...]

Show all lines of a FILE containing characters that don't match the selected
ENCODING.

positional arguments:
  FILE                  the file to be examined

optional arguments:
  -h, --help            show this help message and exit
  -e ENCODING, --encoding ENCODING
                        file encoding to test (default 'ascii')
  -s, --summary         only print the summary
  -c, --count           only print the detected line count
  -l, --lines           only print the detected lines
  -m, --only-matching   hide files without matching lines from output
  -w, --no-warnings     hide warnings from output
  -n, --no-numbers      do not show line numbers in output
  -f N, --fit-width N   trim lines to N characters, or terminal width if N=0;
                        non-printable characters like tabs will be removed
  -t, --title           print title line above each file

Como --encoding , todo codec que o Python 3 sabe é válido. Apenas tente um, no pior caso você recebe uma pequena mensagem de erro ...

    
por Byte Commander 07.02.2016 / 00:03
2

Esse comando Perl substitui principalmente o comando grep (a única coisa que falta são as cores):

perl -ne '/[\x80-\xFF]/&&print($ARGV."($.):\t^".$_)' *.xml
  • n : faz com que o Perl assuma o seguinte loop em torno do seu programa, o que faz com que seja iterado sobre argumentos de nome de arquivo como sed -n ou awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e : pode ser usado para inserir uma linha de programa.
  • /[\x80-\xFF]/&&print($ARGV."($.):\t^".$_) : Se a linha contiver um caractere no intervalo \x80-\xFF , imprime o nome do arquivo atual, o número da linha do arquivo atual, uma string :\t^ e o conteúdo da linha atual.

Saída em um diretório de amostra contendo o arquivo de amostra na pergunta e um arquivo contendo apenas ààààà e um caractere de nova linha:

% perl -ne '/[\x80-\xFF]/&&print($ARGV."($.):\t^".$_)' file | head -n 10
file(9):    ^Appendix F, GNU General Public License.
file(14):   ^(codename "‘Xenial Xerus’"), for the 64-bit PC ("amd64") architecture. It also
file(18):   ^â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
file(330):  ^when things go wrong. The Installation Howto can be found in Appendix A, 
file(337):  ^Chapter 1. Welcome to Ubuntu
file(359):  ^1.1. What is Ubuntu?
file(368):  ^  • Ubuntu will always be free of charge, and there is no extra fee for the "
file(372):  ^  • Ubuntu includes the very best in translations and accessibility
file(376):  ^  • Ubuntu is shipped in stable and regular release cycles; a new release will
file(380):  ^  • Ubuntu is entirely committed to the principles of open source software
% perl -ne '/[\x80-\xFF]/&&print($ARGV."($.):\t^".$_)' file1
file1(1):   ^ààààà
    
por kos 07.02.2016 / 08:16