Obtenir l'encodage d'un fichier sous Windows


206

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


12
Devinez l' encodage d'un fichier dans Windows est ce que le titre devrait être. Si vous ne le savez pas à l'avance, vous ne pourrez jamais deviner avec certitude.
Tom Blodget

Réponses:


222

Ouvrez votre fichier à l'aide du vieux bloc-notes vanille standard fourni avec Windows.
Il vous montrera l'encodage du fichier lorsque vous cliquez sur " Enregistrer sous ... ".
Cela ressemblera à ceci: entrez la description de l'image ici

Quel que soit l'encodage sélectionné par défaut, c'est ce que votre encodage actuel est pour le fichier.
Si c'est UTF-8, vous pouvez le changer en ANSI et cliquez sur enregistrer pour changer l'encodage (ou vice-versa).

Je me rends compte qu'il existe de nombreux types d'encodage différents, mais c'était tout ce dont j'avais besoin lorsque j'ai été informé que nos fichiers d'exportation étaient en UTF-8 et qu'ils nécessitaient ANSI. C'était une exportation unique, donc le Bloc-notes me convenait parfaitement.

FYI: De ma compréhension, je pense que " Unicode " (comme indiqué dans le bloc-notes) est un terme impropre pour UTF-16.
Plus d'informations ici sur l' option " Unicode " du Bloc-notes : Windows 7 - UTF-8 et Unicdoe


1
@Alex, je n'utilise pas Win-8. En effectuant une recherche google, j'ai trouvé ce lien: Bloc-notes Win-8 . J'espère que vous le trouverez car je vous assure qu'il est toujours là.
MikeTeeVee

1
Merci, mais sur Windows 8.1, il n'y a certainement aucune application appelée bloc-notes. Lorsque vous saisissez le bloc-notes dans la recherche, "éditeur" apparaît. Et cela n'a pas cette liste déroulante d'endoding et aucun menu pour cela non plus
Alex

4
Cette méthode ne fonctionne pas pour les fichiers trop volumineux pour que le Bloc-notes s'ouvre. Et cette limite est atteinte beaucoup plus rapidement que d'autres éditeurs comme Notepad ++. Mon Windows 8.1 a un bloc-notes. Regardez dans% windir% \ system32 \ notepad.exe peut-être?
Fabian Kessler

3
Le bloc-notes existe dans Windows 8 et Windows 10.
Alan B

6
Le bloc-notes est installé dans TOUTES les versions de Windows depuis Windows 3 au moins.
Jean-François Larvoire

64

L'outil de ligne de commande (Linux) «fichier» est disponible sur Windows via GnuWin32:

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

Si vous avez installé git, il se trouve dans C: \ Program Files \ git \ usr \ bin.

Exemple:

    C: \ Users \ SH \ Downloads \ SquareRoot> fichier *
    _UpgradeReport_Files; annuaire
    Déboguer; annuaire
    duration.h; Texte du programme ASCII C ++, avec terminateurs de ligne CRLF
    ipch; annuaire
    main.cpp; Texte du programme ASCII C, avec terminateurs de ligne CRLF
    Precision.txt; Texte ASCII, avec terminateurs de ligne CRLF
    Libération; annuaire
    Speed.txt; Texte ASCII, avec terminateurs de ligne CRLF
    SquareRoot.sdf; Les données
    SquareRoot.sln; Texte UTF-8 Unicode (avec nomenclature), avec terminateurs de ligne CRLF
    SquareRoot.sln.docstates.suo; PCX ver. 2.5 données d'image
    SquareRoot.suo; Document CDF V2, corrompu: impossible de lire les informations récapitulatives
    SquareRoot.vcproj; Texte du document XML
    SquareRoot.vcxproj; Texte du document XML
    SquareRoot.vcxproj.filters; Texte du document XML
    SquareRoot.vcxproj.user; Texte du document XML
    squarerootmethods.h; Texte du programme ASCII C, avec terminateurs de ligne CRLF
    UpgradeLog.XML; Texte du document XML

    C: \ Users \ SH \ Downloads \ SquareRoot> fichier --mime-encoding *
    _UpgradeReport_Files; binaire
    Déboguer; binaire
    duration.h; us-ascii
    ipch; binaire
    main.cpp; us-ascii
    Precision.txt; us-ascii
    Libération; binaire
    Speed.txt; us-ascii
    SquareRoot.sdf; binaire
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; binaire
    SquareRoot.suo; Document CDF V2, corrompu: impossible de lire le résumé infobinaire
    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

1
notez que vous avez probablement besoin de git 2.x pour cela, je ne l'ai pas avec git 1.9.5
jakub.g

Pour mon fichier, il dit "binaire" :(
barbara.post

1
Incroyable d'avoir à revenir à la ligne de commande pour un fonctionnement de base, c'est 2017, mais il semble bien fonctionner.
Todd Partridge,

1
Comme le dit l'autre réponse , vous pouvez également utiliser la filecommande dans cygwin . Tout ensemble d'outils POSIX pour Windows devrait avoir file.
palswim

Si vous avez installé git pour windows, il inclut GIT BASH (émulateur bash), qui à son tour inclut la commande 'file'. Je l'ai utilisé et ça fonctionne. C'est également mentionné dans la réponse suivante ...
Amir Katz

61

Si vous avez "git" ou "Cygwin" sur votre machine Windows, allez dans le dossier où se trouve votre fichier et exécutez la commande:

file *

Cela vous donnera les détails d'encodage de tous les fichiers de ce dossier.


ajoutant à votre réponse, si vous ne vous intéressez qu'à un fichier spécifique, vous pouvez utiliser la commande grep pour filtrer les résultats de la file *commande
ebram khalil

Au lieu d'exécuter simplement la commande de fichier à l'aveugle, la commande complète qui répond à cette question est file --mime-encodingd'obtenir l'encodage du fichier
smac89

23

Un autre outil que j'ai trouvé utile: https://archive.codeplex.com/?p=encodingchecker EXE peut être trouvé ici


4
Vraiment utile pour analyser plusieurs fichiers
Eric Bonnot

1
Réponse instantanée même avec de très gros fichiers (comme on pourrait s'y attendre).
Fabian Kessler

1
Fonctionne sur Windows 10.
barbara.post

2
ne peut pas comprendre où se trouve le fichier exe sur cette page. Le lien est-il obsolète?
Christoph

1
@MarkDeven J'ai ajouté le chemin vers exe en réponse
user961954

17

Voici mon avis sur la façon de détecter la famille Unicode d'encodages de texte via BOM. La précision de cette méthode est faible, car cette méthode ne fonctionne que sur les fichiers texte (en particulier les fichiers Unicode), et par défaut asciilorsqu'il n'y a pas de nomenclature (comme la plupart des éditeurs de texte, la valeur par défaut serait UTF8si vous souhaitez faire correspondre l'écosystème HTTP / Web ).

Mise à jour 2018 : je ne recommande plus cette méthode. Je recommande d'utiliser file.exe à partir des outils GIT ou * nix comme recommandé par @Sybren, et je montre comment le faire 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: Cela peut fonctionner raisonnablement bien si les dir, lsou Get-ChildItemseulement des contrôles connus des fichiers texte, et lorsque vous cherchez seulement pour « mauvais encodages » dans une liste connue des outils. (Par exemple, SQL Management Studio utilise par défaut UTF16, qui a cassé GIT auto-cr-lf pour Windows, qui était la valeur par défaut pendant de nombreuses années.)


Get-FileEncodingne semble pas exister sur mon système. Est-ce une applet de commande personnalisée?
Xavier Poinas

Il existe de nombreuses variantes de Get-FileEncodingsur poshcode. J'ai même passé en revue le punycode de python et de nodejs, mais cette petite version atteint 80/20 pour mon utilisation (plus comme 99/1). Si vous filehébergez des fichiers d'autres personnes, je vous suggère d'utiliser la commande de la réponse de Syben ( stackoverflow.com/a/34766140/195755 ) ou un autre décodeur Unicode de qualité production.
yzorg

Il faut ajouter que cette méthode ne fonctionne que si la nomenclature est présente ... ce qui n'est pas toujours le cas
Yepeekai

@Yepeekai La dernière ligne est encodée default(quand aucune nomenclature). Pour XML, JSON et JavaScript, la valeur par défaut est UTF8, mais votre kilométrage peut varier.
yzorg

@yzorg: mais c'est une façon mortelle de le faire. Vous mentez juste à l'utilisateur. Au moins la plupart des analyseurs font une supposition éclairée. Si vous ne pouvez pas deviner, lancez simplement une erreur et dites-leur qu'une nomenclature est requise pour utiliser votre code (puis utilisez un autre outil plus intelligent car il en existe déjà plusieurs).
Ed S.

7

J'ai écrit la réponse n ° 4 (au moment de la rédaction). Mais dernièrement, j'ai installé git sur tous mes ordinateurs, alors maintenant j'utilise 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 devez 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 est sûr de l'utiliser sur un ordinateur sans git, mais écrit des avertissements lorsque git n'est pas trouvé.

Le fichier .exe dans la commande est également la façon dont j'utilise à C:\WINDOWS\system32\where.exepartir de powershell; et de nombreuses autres commandes CLI du système d'exploitation qui sont «masquées par défaut» par powershell, * shrug *.


1
ou vous pouvez simplement utiliser filevotre alias pour file.exe au lieu de file.exe¯ \ _ (ツ) _ / ¯
ferrell_io

@ferrell_io TL; DR: PS est basé sur .NET et .NET a la classe statique de fichiers et PS a assez de la confusion avec surcharge EXEs communs que j'utilise .exe pour différencier PS de Win EXE: dir | where Size -lt 10000vs where.exe git.
yzorg

@ferrell_io J'utilise where.exepour le différencier de wherePS, qui est un alias intégré pour Where-Object. Exemple: where.exe git* vs ls . | where Size -lt 10000
yzorg

@ferrell_io J'utilise donc le même modèle pour file.exela classe statique vs .NET, dont vous pourriez avoir besoin dans le même script qui détecte l'encodage. Exemple: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg

6

Une solution simple pourrait être d'ouvrir le fichier dans Firefox.

  1. Faites glisser et déposez le fichier dans Firefox
  2. Clic droit sur la page
  3. Sélectionnez "Afficher les informations sur la page"

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

entrez la description de l'image ici

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

PS Pour plus d'informations, consultez cet article.


4

Installez git (sous Windows, vous devez utiliser la console git bash). Type:

file *   

pour tous les fichiers du répertoire courant, ou

file */*   

pour les fichiers dans tous les sous-répertoires



2

Semblable à la solution répertoriée ci-dessus avec le Bloc-notes, vous pouvez également ouvrir le fichier dans Visual Studio, si vous l'utilisez. Dans Visual Studio, vous pouvez sélectionner "Fichier> Options d'enregistrement avancées ..."

La zone de liste déroulante "Encodage:" vous indiquera spécifiquement quel encodage est actuellement utilisé pour le fichier. Il contient beaucoup plus d'encodages de texte que le Bloc-notes, il est donc utile lorsqu'il s'agit de divers fichiers du monde entier et de tout le reste.

Tout comme le Bloc-notes, vous pouvez également modifier l'encodage à partir de la liste des options, puis enregistrer le fichier après avoir cliqué sur "OK". Vous pouvez également sélectionner l'encodage souhaité via l'option "Enregistrer avec l'encodage ..." dans la boîte de dialogue Enregistrer sous (en cliquant sur la flèche à côté du bouton Enregistrer).


Bien mais quand j'essaye d'ouvrir le fichier avec Visual Studio, il ouvre toujours le fichier dans l'éditeur de texte associé (Notepad ++ pour ce type d'extension de fichier).
barbara.post

@ barbara.post ce serait quelque chose à voir avec vos paramètres Visual Studio, je pense. J'ai pu accéder à tous les fichiers de texte brut de tout type dans Visual Studio. Vous lui avez probablement dit d'aller simplement dans Notepad ++ chaque fois qu'il rencontre un fichier avec cette extension. Voilà mes pensées, au moins.
JaykeBird

2

Quelques codes C ici pour une détection fiable de ascii, bom et utf8: https://unicodebook.readthedocs.io/guess_encoding.html

Seuls ASCII, UTF-8 et les encodages utilisant une nomenclature (UTF-7 avec BOM, UTF-8 avec BOM, UTF-16 et UTF-32) ont des algorithmes fiables pour obtenir l'encodage d'un document. Pour tous les autres encodages, vous devez faire confiance aux heuristiques basées sur les statistiques.

ÉDITER:

Une version PowerShell d'une réponse C # de: Un moyen efficace de trouver l'encodage de n'importe quel fichier . Fonctionne uniquement avec les 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

1
@jeasoft Merci. J'ai ajouté un correctif pour définir le répertoire courant .net. stackoverflow.com/questions/11246068/…
js2010

1

Le seul moyen que j'ai trouvé pour le faire est VIM ou Notepad ++.


2
Malheureusement, ce ne sont pas des outils "intégrés"
phuclv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.