Obter codificação de um arquivo no Windows

206

Esta não é realmente uma questão de programação. Existe uma linha de comando ou ferramenta do Windows (Windows 7) para obter a codificação atual de um arquivo de texto? Claro que posso escrever um pequeno aplicativo C #, mas queria saber se já existe algo embutido.

TheWebGuy
fonte
12
Acho que a codificação de um arquivo no Windows é como deve ser o título. Se você não souber com antecedência, nunca poderá adivinhar com certeza.
precisa

Respostas:

222

Abra seu arquivo usando o Bloco de notas baunilha antigo comum que acompanha o Windows.
Ele mostrará a codificação do arquivo quando você clicar em " Salvar como ... ".
Ficará assim: insira a descrição da imagem aqui

Qualquer que seja a codificação selecionada padrão, é a codificação atual para o arquivo.
Se for UTF-8, você pode alterá-lo para ANSI e clicar em salvar para alterar a codificação (ou vice-versa).

Percebo que existem muitos tipos diferentes de codificação, mas era tudo o que eu precisava quando fui informado que nossos arquivos de exportação estavam em UTF-8 e exigiam ANSI. Como uma exportação foi feita uma única vez, o Bloco de Notas foi adequado para mim.

FYI: Pelo meu entendimento, acho que " Unicode " (conforme listado no bloco de notas) é um nome impróprio para UTF-16.
Mais aqui na opção " Unicode " do bloco de notas : Windows 7 - UTF-8 e Unicdoe

MikeTeeVee
fonte
1
@ Alex, eu não uso o Win-8. Realizando uma pesquisa no google, encontrei este link: Win-8 Notepad . Espero que você o encontre porque garanto que ainda está lá.
21815 MikeTeeVee
1
Obrigado, mas no Windows 8.1 não há definitivamente nenhum aplicativo chamado bloco de notas. Quando você insere o bloco de notas na pesquisa, "editor" é exibido. E isso não tem que suspensa endoding e nenhum menu para ele quer
Alex
4
Este método não funciona para arquivos muito grandes para o Bloco de Notas abrir. E esse limite é alcançado muito mais rapidamente do que outros editores como o Notepad ++. Meu Windows 8.1 tem o bloco de notas. Olhe em% windir% \ system32 \ notepad.exe talvez?
Fabian Kessler
3
Notepad existe no Windows 8 e Windows 10.
Alan B
6
O bloco de notas é instalado em TODAS as versões do Windows desde o Windows 3, pelo menos.
Jean-François Larvoire
64

A ferramenta de linha de comando (Linux) 'file' está disponível no Windows via GnuWin32:

http://gnuwin32.sourceforge.net/packages/file.htm

Se você possui o git instalado, ele está localizado em C: \ Arquivos de Programas \ git \ usr \ bin.

Exemplo:

    C: \ Usuários \ SH \ Downloads \ SquareRoot> arquivo *
    _UpgradeReport_Files; diretório
    Depurar; diretório
    duration.h; Texto do programa ASCII C ++, com terminadores de linha CRLF
    ipch; diretório
    main.cpp; Texto do programa ASCII C, com terminadores de linha CRLF
    Precision.txt; Texto ASCII, com terminadores de linha CRLF
    Liberação; diretório
    Speed.txt; Texto ASCII, com terminadores de linha CRLF
    SquareRoot.sdf; dados
    SquareRoot.sln; Texto Unicode UTF-8 (com BOM), com terminadores de linha CRLF
    SquareRoot.sln.docstates.suo; PCX ver. 2,5 dados de imagem
    SquareRoot.suo; Documento CDF V2, corrompido: Não é possível ler as informações de resumo
    SquareRoot.vcproj; Texto do documento XML
    SquareRoot.vcxproj; Texto do documento XML
    SquareRoot.vcxproj.filters; Texto do documento XML
    SquareRoot.vcxproj.user; Texto do documento XML
    squarerootmethods.h; Texto do programa ASCII C, com terminadores de linha CRLF
    UpgradeLog.XML; Texto do documento XML

    C: \ Usuários \ SH \ Downloads \ SquareRoot> arquivo --mime-encoding
    _UpgradeReport_Files; binário
    Depurar; binário
    duration.h; us-ascii
    ipch; binário
    main.cpp; us-ascii
    Precision.txt; us-ascii
    Liberação; binário
    Speed.txt; us-ascii
    SquareRoot.sdf; binário
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; binário
    SquareRoot.suo; Documento CDF V2, corrompido: Não é possível ler o resumo infobinário
    SquareRoot.vcproj; us-ascii
    SquareRoot.vcxproj; utf-8
    SquareRoot.vcxproj.filters; utf-8
    SquareRoot.vcxproj.user; utf-8
    squarerootmethods.h; us-ascii
    UpgradeLog.XML; us-ascii
Sybren
fonte
1
Note que você provavelmente precisa 2.x git para ele, eu não tê-lo com git 1.9.5
jakub.g
Para o meu arquivo diz "binário" :(
barbara.post
1
Inacreditável ter que reverter para a linha de comando para a operação básica, isso é 2017, mas parece estar bem.
Todd Partridge
1
Como a outra resposta diz, você também pode usar o filecomando no cygwin . Qualquer conjunto de ferramentas POSIX para Windows deve ter file.
palswim
Se você instalou o git para Windows, ele inclui o GIT BASH (emulador de bash), que por sua vez inclui o comando 'file'. Apenas usei e funciona. Ele também é mencionado na próxima resposta ...
Amir Katz
61

Se você possui "git" ou "Cygwin" em sua máquina Windows, vá para a pasta em que seu arquivo está presente e execute o comando:

file *

Isso fornecerá os detalhes de codificação de todos os arquivos nessa pasta.

George Ninan
fonte
adicionando a sua resposta, se você está interessado apenas em arquivo específico, você pode usar o comando grep para filtrar os resultados de file *comando
ebram khalil
Em vez de executar apenas cegamente o comando file, o comando completo que responde a essa pergunta é file --mime-encodingobter a codificação do arquivo
smac89
23

Outra ferramenta que achei útil: https://archive.codeplex.com/?p=encodingchecker EXE pode ser encontrada aqui

user961954
fonte
4
Realmente útil para analisar vários arquivos
Eric Bonnot 31/03
1
Resposta instantânea, mesmo com arquivos muito grandes (como seria de esperar).
Fabian Kessler
1
Funciona no Windows 10. atual
barbara.post
2
não consigo descobrir onde está o arquivo exe nessa página. O link está desatualizado?
Christoph
1
@MarkDeven eu adicionei caminho para exe em resposta
user961954
17

Aqui está meu exemplo de como detectar a família Unicode de codificações de texto via BOM. A precisão desse método é baixa, pois esse método funciona apenas em arquivos de texto (especificamente arquivos Unicode) e o padrão é asciiquando nenhuma BOM está presente (como a maioria dos editores de texto, o padrão seria UTF8se você deseja corresponder ao ecossistema HTTP / Web )

Atualização 2018 : Não recomendo mais esse método. Recomendo usar o arquivo.exe das ferramentas GIT ou * nix, conforme recomendado pelo @Sybren, e mostro como fazer isso via PowerShell em uma resposta posterior .

# from https://gist.github.com/zommarin/1480974
function Get-FileEncoding($Path) {
    $bytes = [byte[]](Get-Content $Path -Encoding byte -ReadCount 4 -TotalCount 4)

    if(!$bytes) { return 'utf8' }

    switch -regex ('{0:x2}{1:x2}{2:x2}{3:x2}' -f $bytes[0],$bytes[1],$bytes[2],$bytes[3]) {
        '^efbbbf'   { return 'utf8' }
        '^2b2f76'   { return 'utf7' }
        '^fffe'     { return 'unicode' }
        '^feff'     { return 'bigendianunicode' }
        '^0000feff' { return 'utf32' }
        default     { return 'ascii' }
    }
}

dir ~\Documents\WindowsPowershell -File | 
    select Name,@{Name='Encoding';Expression={Get-FileEncoding $_.FullName}} | 
    ft -AutoSize

Recomendação: Isso pode funcionar razoavelmente bem, se as dir, lsou Get-ChildItemapenas verifica conhecidos arquivos de texto, e quando você só está procurando "maus codificações" de uma lista conhecida de ferramentas. (ou seja, o SQL Management Studio assume como padrão o UTF16, que interrompeu o GIT auto-cr-lf para Windows, que foi o padrão por muitos anos.)

yzorg
fonte
Get-FileEncodingparece não existir no meu sistema. É um cmdlet personalizado?
Xavier Poinas
Existem muitas variações de Get-FileEncodingno poshcode. Eu até revi o punycode de python e nodejs, mas esta versão pequena atinge 80/20 para o meu uso (mais como 99/1). Se você estiver hospedando arquivos de outras pessoas, sugiro que você use o filecomando da resposta da Syben ( stackoverflow.com/a/34766140/195755 ) ou outro decodificador unicode com qualidade de produção.
yzorg 27/05
Deve-se acrescentar que este método funciona apenas se o BOM está presente ... o que nem sempre é o caso
Yepeekai
@Yepeekai A última linha é defaultcodificada (quando não há BOM). Para XML, JSON e JavaScript, o padrão é UTF8, mas sua milhagem pode variar.
yzorg 20/02
@yzorg: mas essa é uma maneira cerebral de fazê-lo. Você está apenas mentindo para o usuário. Pelo menos a maioria dos analisadores faz um palpite. Se você não consegue adivinhar, basta gerar um erro e informar que uma lista técnica é necessária para usar seu código (e depois use outra ferramenta mais inteligente, já que muitas já existem).
Ed S.
7

Eu escrevi a resposta # 4 (no momento da redação). Mas ultimamente eu tenho o git instalado em todos os meus computadores, então agora uso a solução da @ Sybren. Aqui está uma nova resposta que torna essa solução acessível a partir do PowerShell (sem colocar todo o git / usr / bin no PATH, o que é muito complicado para mim).

Adicione isto ao seu profile.ps1:

$global:gitbin = 'C:\Program Files\Git\usr\bin'
Set-Alias file.exe $gitbin\file.exe

E usado como: file.exe --mime-encoding *. Você deve incluir .exe no comando para que o alias do PS funcione.

Mas se você não personalizar seu perfil do PowerShell.ps1, sugiro que comece com o meu: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 e salve-o em ~\Documents\WindowsPowerShell. É seguro usá-lo em um computador sem o git, mas gravará avisos quando o git não for encontrado.

O .exe no comando também é como eu uso C:\WINDOWS\system32\where.exeno PowerShell; e muitos outros comandos da CLI do OS "ocultos por padrão" pelo PowerShell, * shrug *.

yzorg
fonte
1
ou você pode simplesmente usar filecomo alias para file.exe em vez de file.exe¯ \ _ (ツ) _ / ¯
ferrell_io 9/18
@ferrell_io TL; DR: PS é baseado em .NET e .NET tem classe estática Arquivo e PS tem sobrecargas bastante confuso com EXEs comuns que eu uso .exe para diferenciar PS de Win EXE: dir | where Size -lt 10000vs where.exe git.
yzorg 13/02/19
@ferrell_io Eu uso where.exepara diferenciá-lo do wherePS, que é um alias interno para Where-Object. Exemplo: where.exe git* vs ls . | where Size -lt 10000
yzorg 25/11/19
@ferrell_io Então, eu uso o mesmo padrão para a file.execlasse estática vs .NET, que você pode precisar no mesmo script que está detectando a codificação. Exemplo: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg 25/11/19
6

Uma solução simples pode estar abrindo o arquivo no Firefox.

  1. Arraste e solte o arquivo no firefox
  2. Clique com o botão direito na página
  3. Selecione "Exibir informações da página"

e a codificação de texto aparecerá na janela "Informações da página".

insira a descrição da imagem aqui

Nota: Se o arquivo não estiver no formato txt, renomeie-o para txt e tente novamente.

PS Para mais informações, consulte este artigo.

Just Shadow
fonte
4

Instale o git (no Windows, você deve usar o git bash console). Tipo:

file *   

para todos os arquivos no diretório atual ou

file */*   

para os arquivos em todos os subdiretórios

phd_coder
fonte
2

Semelhante à solução listada acima com o Bloco de Notas, você também pode abrir o arquivo no Visual Studio, se estiver usando isso. No Visual Studio, você pode selecionar "Arquivo> Opções avançadas de salvamento ..."

A caixa de combinação "Codificação:" informará especificamente qual codificação está sendo usada atualmente para o arquivo. Ele possui muito mais codificações de texto listadas do que o Bloco de Notas, por isso é útil ao lidar com vários arquivos de todo o mundo e qualquer outra coisa.

Assim como o Bloco de notas, você também pode alterar a codificação na lista de opções e salvar o arquivo depois de pressionar "OK". Você também pode selecionar a codificação desejada através da opção "Salvar com codificação ..." na caixa de diálogo Salvar como (clicando na seta ao lado do botão Salvar).

JaykeBird
fonte
Bom, mas quando tento abrir o arquivo com o Visual Studio, ele sempre abre o arquivo no editor de texto associado (Notepad ++ para esse tipo de extensão).
precisa saber é o seguinte
@ barbara.post que seria algo relacionado às suas configurações do Visual Studio, eu acho. Consegui acessar arquivos de texto sem formatação de qualquer tipo no Visual Studio. Você provavelmente já disse para ir ao Notepad ++ sempre que encontrar um arquivo com essa extensão. Esse é o meu pensamento, pelo menos.
JaykeBird
2

Algum código C aqui para detecção confiável de ascii, bom e utf8: https://unicodebook.readthedocs.io/guess_encoding.html

Somente ASCII, UTF-8 e codificações usando uma BOM (UTF-7 com BOM, UTF-8 com BOM, UTF-16 e UTF-32) possuem algoritmos confiáveis ​​para obter a codificação de um documento. Para todas as outras codificações, você deve confiar nas heurísticas com base nas estatísticas.

EDITAR:

Uma versão powershell de uma resposta C # de: Maneira eficaz de encontrar a codificação de qualquer arquivo . Funciona apenas com assinaturas (boms).

# get-encoding.ps1
param([Parameter(ValueFromPipeline=$True)] $filename)    
begin {
  # set .net current directoy                                                                                                   
  [Environment]::CurrentDirectory = (pwd).path
}
process {
  $reader = [System.IO.StreamReader]::new($filename, 
    [System.Text.Encoding]::default,$true)
  $peek = $reader.Peek()
  $encoding = $reader.currentencoding
  $reader.close()
  [pscustomobject]@{Name=split-path $filename -leaf
                BodyName=$encoding.BodyName
                EncodingName=$encoding.EncodingName}
}


.\get-encoding chinese8.txt

Name         BodyName EncodingName
----         -------- ------------
chinese8.txt utf-8    Unicode (UTF-8)


get-childitem -file | .\get-encoding
js2010
fonte
1
@jeasoft Obrigado. Eu adicionei uma correção para definir o diretório atual .net. stackoverflow.com/questions/11246068/…
js2010 27/09/19
1

A única maneira que encontrei para fazer isso é o VIM ou o Notepad ++.

Todd Partridge
fonte
2
Infelizmente eles não são ferramentas "embutidas"
phuclv