Eu tenho vários .htm
arquivos que abrem no Gedit sem nenhum aviso / erro, mas quando eu abro esses mesmos arquivos Jedit
, ele me avisa sobre a codificação UTF-8 inválida ...
A meta tag HTML indica "charset = ISO-8859-1". O Jedit permite uma lista de codificações de fallback e uma lista de detectores automáticos de codificação (atualmente "BOM XML-PI"), portanto meu problema imediato foi resolvido. Mas isso me fez pensar: e se os metadados não estivessem lá?
Quando as informações de codificação simplesmente não estão disponíveis, existe um programa CLI que pode "adivinhar" quais codificações podem ser aplicadas?
E, embora seja uma questão um pouco diferente; existe um programa CLI que testa a validade de uma codificação conhecida ?
Respostas:
O
file
comando faz "melhores palpites" sobre a codificação. Use o-i
parâmetro para forçarfile
a impressão de informações sobre a codificação.Demonstração:
Aqui está como eu criei os arquivos:
Hoje em dia tudo é utf-8. Mas convença-se:
Compare com https://en.wikipedia.org/wiki/Ä#Computer_encoding
Converta para as outras codificações:
Verifique o dump hexadecimal:
Crie algo "inválido" misturando os três:
O que
file
diz:sem
-i
:O
file
comando não tem idéia de "válido" ou "inválido". Ele vê apenas alguns bytes e tenta adivinhar qual pode ser a codificação. Como seres humanos, podemos reconhecer que um arquivo é um arquivo de texto com alguns tremados em uma codificação "errada". Mas, como um computador, seria necessário algum tipo de inteligência artificial.Alguém poderia argumentar que a heurística de
file
é algum tipo de inteligência artificial. No entanto, mesmo que seja, é muito limitado.Aqui está mais informações sobre o
file
comando: http://www.linfo.org/file_command.htmlfonte
, but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1.
arquivo -i` relatadounknown-8bit
. Então, isso também parece ser a resposta para: "Como detectar um / codificação desconhecida inválido"file -I
com um 'i' maiúsculo em vez de minúsculo.Nem sempre é possível descobrir com certeza qual é a codificação de um arquivo de texto. Por exemplo, a sequência de bytes
\303\275
(c3 bd
em hexadecimal) pode estarý
em UTF-8, ouý
em latin1, ouĂ˝
em latin2, ou羸
em BIG-5, e assim por diante.Algumas codificações têm seqüências de bytes inválidas, portanto é possível descartá-las com certeza. Isso é verdade principalmente do UTF-8; a maioria dos textos na maioria das codificações de 8 bits não é UTF-8 válida. Você pode testar para UTF-8 válida com
isutf8
a partir moreutils ou comiconv -f utf-8 -t utf-8 >/dev/null
, entre outros.Existem ferramentas que tentam adivinhar a codificação de um arquivo de texto. Eles podem cometer erros, mas geralmente funcionam na prática, desde que você não tente enganá-los deliberadamente.
file
Encode::Guess
(parte da distribuição padrão) tenta codificações sucessivas em uma sequência de bytes e retorna a primeira codificação na qual a sequência é um texto válido.Se houver metadados (HTML / XML
charset=
, TeX\inputenc
, emacs-*-coding-*-
,…) no arquivo, editores avançados como o Emacs ou o Vim geralmente poderão analisar esses metadados. Isso não é fácil de automatizar a partir da linha de comando.fonte
iconv
, eu apenas executei todas as 1168 codificações (incluindo aliases) listadas emiconv -l
um dos meus arquivos .htm ... Havia 683 codificações que passaram na reunião .. O conjunto de caracteres real do arquivo = ISO-8859-1 .. composto por todos os valores de intervalo ASCII da barra um .. O caractere não ASCII era \ xA9.Também no caso de você arquivar -i, você não sabe
Você pode usar este comando php que pode adivinhar o charset como abaixo:
No php você pode conferir como abaixo:
Especificando lista de codificação explicitamente:
" Mb_list_encodings " mais preciso :
Aqui no primeiro exemplo, você pode ver que eu coloquei uma lista de codificações (detectar a ordem da lista) que podem estar correspondentes. Para obter resultados mais precisos, você pode usar todas as codificações possíveis em: mb_list_encodings ()
Nota As funções mb_ * requerem php-mbstring
Consulte a resposta: https://stackoverflow.com/a/57010566/3382822
fonte