2017-03-01 2 views
1

j'ai un fichier html test.html créé par un atome qui contient:Powershell et UTF-8

Testé codage UTF-8

Lorsque je l'ai lu avec la console Powershell (I « m sous Windows français)

Get-Content -Raw test.html 

je reviens ceci:

Testé encoding utf-8 

Pourquoi le caractère accent ne s'imprime pas correctement?

Répondre

2
  • Le Atom editor crée des fichiers UTF-8 sans un pseudo-BOM par par défaut (ce qui est la bonne chose à faire, d'un point de vue multiplateforme).

  • PowerShell reconnaît uniquement les fichiers UTF-8 avec un pseudo-nomenclature.

    • En l'absence de la pseudo-BOM, PowerShell interprète les fichiers comme étant formaté selon héritage de codepage, tels que Windows-1252 sur les systèmes américains, par exemple du système.
      (Ceci est également l'encodage par défaut utilisé par le Bloc-notes, qu'il appelle « ANSI », pas seulement quand lecture fichiers, mais aussi quand créant eux. En revanche, PowerShell crée fichiers codés en UTF-16LE par par défaut.)

par conséquent, afin Get-Content reconnaître une nomenclature -moins fichier UTF-8 correctement, vous devez
utiliser -Encoding utf8.


Note: Maintenant que PowerShell fonctionne sur Unix aussi, le soutien à la nomenclature-moins UTF-8 fichiers - à la fois sur la lecture et l'écriture - est en cours de planification (de cette écriture) - voir this RFC.

1
# Created a UTF-8 Sig File 
notepad .\test.html 

# Get File contents with/without -raw 
cat .\test.html;Get-Content -Raw .\test.html 
Testé encoding utf-8 
Testé encoding utf-8 

# Check Encoding to make sure 
Get-FileEncoding .\test.html 
utf8 

Comme vous pouvez le voir, il fonctionne certainement dans PowerShell v5 sous Windows 10. Je la vérification que le formatage de fichiers et le contenu du fichier créé, car il peut avoir été introduit des caractères que votre éditeur pourrait pas ramasser.

Si vous ne disposez pas Get-FileEncoding comme une applet de commande dans votre PowerShell, voici une implémentation vous pouvez exécuter:

function Get-FileEncoding([Parameter(Mandatory=$True)]$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'} 
    } 
} 
+1

Get-FileEncoding n'est pas reconnu sur ma PowerShell si je suis sur Windows 10? – user310291

+0

L'OP a créé son fichier avec l'éditeur Atom de GitHub, qui crée par défaut des fichiers UTF-8 _ sans pseudo-BOM_, et c'est la cause du problème. Le Bloc-notes ne crée pas de fichiers UTF-8 par défaut - il utilise par défaut la page de code de votre système (par exemple, Windows-1252 sur les systèmes en anglais), PowerShell lorsque vous lisez un fichier sans nomenclature, c'est pourquoi vous n'avez pas voir le problème. En aparté: 'cat' est juste un alias pour' Get-Content' sous Windows, il n'y a donc aucun intérêt à contraster les deux commandes. – mklement0

+0

'Get-FileEncoding' n'est pas une cmdlet standard. La meilleure façon d'examiner le fichier est d'utiliser la cmdlet standard Format-Hex (PSv5 +) et d'étudier les octets bruts. J'ai trouvé deux sources 'Get-FileEncoding' probables: de [ici à poshcode.org] (http://poshcode.org/2059) ou dans le cadre du [module PowerShellCookbook] (https://www.powershellgallery.com /packages/PowerShellCookbook/1.3.6) dans la galerie PowerShell. Aucune des deux versions ne mentionne UTF-8 pour moi (Windows 10, PSv5.1): le premier recherche uniquement une nomenclature et signale ASCII s'il n'y en a pas (ce qui est vrai pour 'test.html'); de même, ce dernier retombe à UTF-7. – mklement0