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é ?
Réponses
Trop de publicités?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).
Une solution simple consiste à ouvrir le fichier dans Firefox.
- Glisser-déposer le fichier dans firefox
- 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".
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.
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*.
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