301 votes

Obtenir le codage d'un fichier sous Windows

Ce n'est pas vraiment une question de programmation, mais existe-t-il une ligne de commande ou un outil Windows (Windows 7) pour obtenir l'encodage actuel d'un fichier texte ? Il est certain que je peux écrire une petite application en C# mais je voulais savoir s'il y avait déjà quelque chose d'intégré ?

20voto

yzorg Points 1139

Voici mon point de vue sur la manière de détecter la famille Unicode des encodages de texte par le biais de la nomenclature. La précision de cette méthode est faible, car elle ne fonctionne que sur les fichiers texte (en particulier les fichiers Unicode), et elle utilise par défaut ascii lorsqu'il n'y a pas de nomenclature (comme dans la plupart des éditeurs de texte, la valeur par défaut est UTF8 si vous voulez correspondre à l'écosystème HTTP/web).

Mise à jour 2018 : Je ne recommande plus cette méthode. Je recommande d'utiliser file.exe de GIT ou des outils *nix comme le recommande @Sybren, et Je montrerai comment faire cela via PowerShell dans une réponse ultérieure. .

# 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

Recommandation : Cette solution peut fonctionner raisonnablement bien si le dir , ls ou Get-ChildItem ne vérifie que les fichiers texte connus, et lorsque vous ne recherchez que les "mauvais encodages" à partir d'une liste connue d'outils. (i.e. SQL Management Studio utilise par défaut UTF16, ce qui a cassé l'auto-cr-lf de GIT pour Windows, qui était l'encodage par défaut depuis de nombreuses années).

14voto

Just Shadow Points 2077

Une solution simple consiste à ouvrir le fichier dans Firefox.

  1. Glisser-déposer le fichier dans firefox
  2. Appuyez sur Ctrl+I pour ouvrir les informations sur la page.

et l'encodage du texte apparaîtra dans la fenêtre "Informations sur la page".

enter image description here

Nota: Si le fichier n'est pas au format txt, renommez-le en txt et réessayez.

P.S. Pour plus d'informations, voir este article.

9voto

yzorg Points 1139

J'ai écrit la réponse n°4 (au moment de la rédaction). Mais depuis peu, j'ai installé git sur tous mes ordinateurs, et j'utilise donc la solution de @Sybren. Voici une nouvelle réponse qui rend cette solution pratique à partir de powershell (sans mettre tout git/usr/bin dans le PATH, ce qui est trop encombrant pour moi).

Ajoutez ceci à votre profile.ps1 :

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

Et utilisé comme : file.exe --mime-encoding * . Vous doit inclure .exe dans la commande pour que l'alias PS fonctionne.

Mais si vous ne personnalisez pas votre profil PowerShell.ps1, je vous suggère de commencer par le mien : https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 et l'enregistrer dans ~\Documents\WindowsPowerShell . Il peut être utilisé en toute sécurité sur un ordinateur sans git, mais écrira des avertissements si git n'est pas trouvé.

Les .exe dans la commande est également la façon dont j'utilise C:\WINDOWS\system32\where.exe à partir de powershell ; et beaucoup d'autres commandes CLI du système d'exploitation qui sont "cachées par défaut" par powershell, *shrug*.

4voto

DINA TAKLIT Points 563

Vous pouvez simplement le vérifier en ouvrant votre git bash à l'emplacement du fichier et en lançant la commande file -i file_name

exemple

user filesData
$ file -i data.csv
data.csv: text/csv; charset=utf-8

3voto

js2010 Points 823

Un peu de code C ici pour une détection fiable des ascii, bom's et utf8 : https://unicodebook.readthedocs.io/guess_encoding.html

O UTF-16 et UTF-32) disposent d'algorithmes fiables pour obtenir le codage d'un document. Pour tous les autres encodages, vous devez vous fier à des heuristiques basées sur des statistiques.

EDIT :

Une version powershell d'une réponse C# de : Un moyen efficace de trouver l'encodage de n'importe quel fichier . Ne fonctionne qu'avec des signatures (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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X