Obtener la codificación de un archivo en Windows

206

Esta no es realmente una pregunta de programación, ¿hay una línea de comando o una herramienta de Windows (Windows 7) para obtener la codificación actual de un archivo de texto? Claro que puedo escribir una pequeña aplicación de C #, pero quería saber si ya hay algo integrado.

TheWebGuy
fuente
12
Adivina la codificación de un archivo en Windows es lo que debería ser el título. Si no lo sabe de antemano, nunca podrá adivinar con certeza.
Tom Blodget

Respuestas:

222

Abra su archivo usando el Bloc de notas vanilla antiguo que viene con Windows.
Le mostrará la codificación del archivo cuando haga clic en " Guardar como ... ".
Se verá así: ingrese la descripción de la imagen aquí

Cualquiera que sea la codificación seleccionada por defecto, esa es la codificación actual para el archivo.
Si es UTF-8, puede cambiarlo a ANSI y hacer clic en guardar para cambiar la codificación (o viceversa).

Me doy cuenta de que hay muchos tipos diferentes de codificación, pero esto era todo lo que necesitaba cuando me informaron que nuestros archivos de exportación estaban en UTF-8 y requerían ANSI. Fue una exportación de una sola vez, por lo que el Bloc de notas se ajustaba perfectamente.

FYI: Según tengo entendido, creo que " Unicode " (como aparece en el Bloc de notas) es un nombre inapropiado para UTF-16.
Más información sobre la opción " Unicode " del Bloc de notas : Windows 7 - UTF-8 y Unicdoe

MikeTeeVee
fuente
1
@ Alex, no uso Win-8. Al realizar una búsqueda en Google, encontré este enlace: Bloc de notas Win-8 . Espero que lo encuentres porque te aseguro que todavía está allí.
MikeTeeVee
1
Gracias, pero en Windows 8.1 definitivamente no hay una aplicación llamada bloc de notas. Cuando ingresa el bloc de notas en la búsqueda, aparece "editor". Y esto no tiene ese menú desplegable de endoding y tampoco tiene un menú para él
Alex
44
Este método no funciona para archivos que son demasiado grandes para abrir el Bloc de notas. Y ese límite se alcanza mucho más rápido que otros editores como Notepad ++. Mi Windows 8.1 tiene Bloc de notas. ¿Buscar en% windir% \ system32 \ notepad.exe quizás?
Fabian Kessler
3
El Bloc de notas existe en Windows 8 y Windows 10.
Alan B
66
El Bloc de notas está instalado en TODAS las versiones de Windows desde Windows 3 al menos.
Jean-François Larvoire
64

El 'archivo' de la herramienta de línea de comandos (Linux) está disponible en Windows a través de GnuWin32:

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

Si tiene instalado git, se encuentra en C: \ Archivos de programa \ git \ usr \ bin.

Ejemplo:

    C: \ Usuarios \ SH \ Descargas \ SquareRoot> archivo *
    _UpgradeReport_Files; directorio
    Depurar; directorio
    duración.h; Texto del programa ASCII C ++, con terminadores de línea CRLF
    ipch; directorio
    main.cpp; Texto del programa ASCII C, con terminadores de línea CRLF
    Precision.txt; Texto ASCII, con terminadores de línea CRLF
    Lanzamiento; directorio
    Speed.txt; Texto ASCII, con terminadores de línea CRLF
    SquareRoot.sdf; datos
    SquareRoot.sln; Texto UTF-8 Unicode (con BOM), con terminadores de línea CRLF
    SquareRoot.sln.docstates.suo; PCX ver. 2.5 datos de imagen
    SquareRoot.suo; Documento CDF V2, corrupto: no se puede leer la información de resumen
    SquareRoot.vcproj; Texto del documento XML
    SquareRoot.vcxproj; Texto del documento XML
    SquareRoot.vcxproj.filters; Texto del documento XML
    SquareRoot.vcxproj.user; Texto del documento XML
    squarerootmethods.h; Texto del programa ASCII C, con terminadores de línea CRLF
    UpgradeLog.XML; Texto del documento XML

    C: \ Users \ SH \ Downloads \ SquareRoot> archivo --mime-encoding *
    _UpgradeReport_Files; binario
    Depurar; binario
    duración.h; nosotros-ascii
    ipch; binario
    main.cpp; nosotros-ascii
    Precision.txt; nosotros-ascii
    Lanzamiento; binario
    Speed.txt; nosotros-ascii
    SquareRoot.sdf; binario
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; binario
    SquareRoot.suo; Documento CDF V2, corrupto: no se puede leer el resumen infobinario
    SquareRoot.vcproj; nosotros-ascii
    SquareRoot.vcxproj; utf-8
    SquareRoot.vcxproj.filters; utf-8
    SquareRoot.vcxproj.user; utf-8
    squarerootmethods.h; nosotros-ascii
    UpgradeLog.XML; nosotros-ascii
Sybren
fuente
1
tenga en cuenta que probablemente necesite git 2.x para ello, no lo tengo con git 1.9.5
jakub.g
Para mi archivo dice "binario" :(
barbara.post
1
Increíble tener que volver a la línea de comando para la operación básica, este es 2017, pero parece estar bien.
Todd Partridge
1
Como dice la otra respuesta , también puede usar el filecomando en cygwin . Cualquier conjunto de herramientas POSIX para Windows debería tener file.
palswim
Si instaló git para Windows, incluye GIT BASH (emulador de bash), que a su vez incluye el comando 'archivo'. Solo lo usé y funciona. También se menciona en la siguiente respuesta ...
Amir Katz
61

Si tiene "git" o "Cygwin" en su máquina con Windows, vaya a la carpeta donde está su archivo y ejecute el comando:

file *

Esto le dará los detalles de codificación de todos los archivos en esa carpeta.

George Ninan
fuente
agregando a su respuesta, si solo le interesa un archivo específico, puede usar el comando grep para filtrar los resultados del file *comando
ebram khalil
En lugar de simplemente ejecutar el comando de archivo a ciegas, el comando completo que responde a esta pregunta es file --mime-encodingobtener la codificación del archivo
smac89
23

Otra herramienta que encontré útil: https://archive.codeplex.com/?p=encodingchecker EXE se puede encontrar aquí

usuario961954
fuente
44
Realmente útil para analizar múltiples archivos
Eric Bonnot
1
Respuesta instantánea incluso con archivos muy grandes (como cabría esperar).
Fabian Kessler
1
Funciona en Windows 10. actual
barbara.post
2
no puedo averiguar dónde está el archivo exe en esa página. ¿El enlace está desactualizado?
Christoph
1
@ MarkDeven He agregado una ruta a exe en respuesta
user961954
17

Aquí está mi opinión sobre cómo detectar la familia Unicode de codificaciones de texto a través de BOM. La precisión de este método es baja, ya que este método solo funciona en archivos de texto (específicamente archivos Unicode), y el valor predeterminado es asciicuando no hay BOM presente (como la mayoría de los editores de texto, el valor predeterminado sería UTF8si desea hacer coincidir el ecosistema HTTP / web )

Actualización 2018 : ya no recomiendo este método. Recomiendo usar file.exe de las herramientas GIT o * nix como lo recomienda @Sybren, y en una respuesta posterior muestro cómo hacerlo a través de PowerShell .

# 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

Recomendación: Esto puede funcionar razonablemente bien si el dir, lso Get-ChildItemsólo comprueba conocidos archivos de texto, y cuando sólo están buscando "malos" de codificaciones de una lista conocida de herramientas. (es decir, SQL Management Studio tiene como valor predeterminado UTF16, que rompió GIT auto-cr-lf para Windows, que fue el valor predeterminado durante muchos años).

yzorg
fuente
Get-FileEncodingno parece existir en mi sistema. ¿Es un cmdlet personalizado?
Xavier Poinas
Hay muchas variaciones de Get-FileEncodingposhcode. Incluso he revisado punycode de python y nodejs, pero esta versión pequeña alcanza 80/20 para mi uso (más como 99/1). Si aloja los archivos de otras personas, le sugiero que use el filecomando de la respuesta de Syben ( stackoverflow.com/a/34766140/195755 ) u otro decodificador Unicode de calidad de producción.
yzorg
Debe agregarse que este método funciona solo si la lista de materiales está presente ... lo cual no siempre es el caso
Yepeekai
@Yepeekai La última línea está defaultcodificando (cuando no hay BOM). Para XML, JSON y JavaScript, el valor predeterminado es UTF8, pero su kilometraje puede variar.
yzorg
@yzorg: pero esa es una forma cerebral de hacerlo. Solo le mientes al usuario. Al menos la mayoría de los analizadores hacen una suposición educada. Si no puede adivinar, simplemente arroje un error y dígales que se requiere una lista de materiales para usar su código (y luego use otra herramienta más inteligente, ya que muchas ya existen).
Ed S.
7

Escribí la respuesta # 4 (al momento de escribir). Pero últimamente tengo instalado git en todas mis computadoras, así que ahora uso la solución de @ Sybren. Aquí hay una nueva respuesta que hace que la solución sea útil desde powershell (sin poner todo git / usr / bin en la RUTA, lo cual es demasiado desorden para mí).

Agregue esto a su profile.ps1:

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

Y se utiliza como: file.exe --mime-encoding *. Usted debe incluir .exe en el comando para PS alias para el trabajo.

Pero si no personaliza su PowerShell profile.ps1, le sugiero que comience con el mío: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 y guárdelo en ~\Documents\WindowsPowerShell. Es seguro usarlo en una computadora sin git, pero escribirá advertencias cuando no se encuentre git.

El .exe en el comando también es cómo lo uso C:\WINDOWS\system32\where.exedesde powershell; y muchos otros comandos de la CLI del sistema operativo que están "ocultos por defecto" por powershell, * shrug *.

yzorg
fuente
1
o simplemente puede usarlo filecomo su alias para file.exe en lugar de file.exe¯ \ _ (ツ) _ / ¯
ferrell_io
@ferrell_io TL; DR: PS se basa en .NET y .NET tiene clase estática de archivos, y PS tiene suficientes sobrecargas confundiendo con EXE comunes que utilizo .exe para diferenciar PS de victorias EXE: dir | where Size -lt 10000vs where.exe git.
yzorg
@ferrell_io Utilizo where.exepara diferenciarlo de wherePS, que es un alias incorporado para Where-Object. Ejemplo: where.exe git* vs ls . | where Size -lt 10000
yzorg
@ferrell_io Así que uso el mismo patrón para file.exela clase estática vs .NET, que podría necesitar en el mismo script que detecta la codificación. Ejemplo: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg
6

Una solución simple podría ser abrir el archivo en Firefox.

  1. Arrastra y suelta el archivo en Firefox
  2. Haga clic derecho en la página
  3. Seleccione "Ver información de la página"

y la codificación de texto aparecerá en la ventana "Información de la página".

ingrese la descripción de la imagen aquí

Nota: Si el archivo no está en formato txt, simplemente cámbiele el nombre a txt e intente nuevamente.

PD Para más información ver este artículo.

Solo sombra
fuente
4

Instale git (en Windows debe usar la consola git bash). Tipo:

file *   

para todos los archivos en el directorio actual, o

file */*   

para los archivos en todos los subdirectorios

phd_coder
fuente
2

Similar a la solución enumerada anteriormente con el Bloc de notas, también puede abrir el archivo en Visual Studio, si lo está usando. En Visual Studio, puede seleccionar "Archivo> Opciones avanzadas de guardado ..."

El cuadro combinado "Codificación:" le dirá específicamente qué codificación se está utilizando actualmente para el archivo. Tiene muchas más codificaciones de texto enumeradas allí que el Bloc de notas, por lo que es útil cuando se trata con varios archivos de todo el mundo y cualquier otra cosa.

Al igual que el Bloc de notas, también puede cambiar la codificación de la lista de opciones allí, y luego guardar el archivo después de presionar "Aceptar". También puede seleccionar la codificación que desee a través de la opción "Guardar con codificación ..." en el cuadro de diálogo Guardar como (haciendo clic en la flecha al lado del botón Guardar).

JaykeBird
fuente
Agradable, pero cuando trato de abrir el archivo con Visual Studio, siempre abre el archivo en el editor de texto asociado (Notepad ++ para este tipo de extensión de archivo).
barbara.post
@ barbara.post eso sería algo que ver con la configuración de Visual Studio, creo. He podido acceder a cualquier archivo de texto sin formato de cualquier tipo en Visual Studio. Probablemente le haya dicho que solo vaya a Notepad ++ cada vez que encuentre un archivo con esa extensión. Esos son mis pensamientos, al menos.
JaykeBird
2

Algún código C aquí para una detección confiable de ascii, bom's y utf8: https://unicodebook.readthedocs.io/guess_encoding.html

Solo ASCII, UTF-8 y codificaciones que usan una BOM (UTF-7 con BOM, UTF-8 con BOM, UTF-16 y UTF-32) tienen algoritmos confiables para obtener la codificación de un documento. Para todas las demás codificaciones, debe confiar en la heurística basada en estadísticas.

EDITAR:

Una versión de PowerShell de una respuesta de C # de: forma efectiva de encontrar la codificación de cualquier archivo . Solo funciona con firmas (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
fuente
1
@jeasoft Gracias. Agregué una solución para establecer el directorio actual .net. stackoverflow.com/questions/11246068/…
js2010
1

La única forma en que he encontrado para hacer esto es VIM o Notepad ++.

Perdiz de Todd
fuente
2
Por desgracia no están incorporadas herramientas ""
phuclv