2016-12-13 2 views
1

Je sais, c'est une vieille question, mais aucune des réponses que j'ai trouvé aide dans le scénario suivant:commande de la console et la sortie unicode

fc /u TextA.txt TextB.txt 

compare les deux Unicode encodé txt fichiers et affiche correctement le résultat (!) sur l'écran.

Comme prévu,

fc /u TextA.txt TextB.txt > Comp.txt 

ne se traduit pas dans un fichier codé Unicode.

Malheureusement, la méthode utilisée dans des situations similaires

cmd /u /c fc /u TextA.txt TextB.txt > Comp.txt 

ne fonctionne pas, le fichier généré est codé ANSI.

J'espère que quelqu'un ici peut aider ...

ÉDITÉ (après les premières commentaires): Le problème semble être que cmd /u (ou chcp) fonctionne uniquement avec des commandes « internes » (comme dir). fc n'est pas une commande interne ... (Merci à LotPings!)

+0

@Fabre: Le premier exemple ne fait aucune différence, le second ne semble pas être une syntaxe correcte. - Je ne sais pas comment publier des fichiers ici ... Mais vous pouvez simplement écrire un mot dans le Bloc-notes et enregistrer le fichier en Unicode, la même chose pour le second fichier, puis regarder si le fichier Comp.txt est encodé en Unicode ou ANSI. – newbieforever

+0

hey vous avez raison! Ne vous oubliez pas qui résout les problèmes ici :) Très très bon point. Mérite un petit quelque chose. –

+0

Eh bien, je suis coincé, tout comme vous. 'cmd/u' ne semble pas fonctionner! –

Répondre

0

Réponse courte:

Utilisez Compare-Object cmdlet de PowerShell comme suit:

Compare-Object (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt") 

sortie Fondamentalement personnalisé dans un fichier:

Compare-Object (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt") | 
    Format-Table -Property SideIndicator, InputObject -AutoSize -HideTableHeaders -Wrap | 
    Out-File .\fileAB.txt -Encoding unicode 

ou

Compare-Object (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt") -PassThru | 
    Out-File .\fileAB.txt -Encoding unicode 

réponse originale (voir aussi amendement ci-dessous):

La č lettre (lettre minuscule latine C Avec Caron, codepoint U+010D) apparaît dans les pages de code 775/1257 (Baltique) et 852/1250 (Europe centrale). Je suppose que ce dernier comme le mot koča sonne comme commun terme slave pour l'anglais mais, cabine ou chalet.

Reproduisez le problème.L'exemple suivant montre un cas possible mojibake entre OEM et ANSI pages de codes; apparemment, cmd.exe lui-même fait quelques implicites (et peu claires) transformations de caractères:

D:\test\Unicode> powershell -c "'fileA','fileB'|ForEach-Object {$_; Get-Content .\$_.txt}" 
fileA 
a lc ěščřžýáíé ď ť ň 
a UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
fileB 
b lc ěščřžýáíé ď ť ň 
b UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 

D:\test\Unicode> chcp 
Active code page: 1250 

D:\test\Unicode> fc.exe /U .\fileA.txt .\fileB.txt > .\CompAB_1250.txt 

D:\test\Unicode> type .\CompAB_1250.txt 
Comparing files .\fileA.txt and .\FILEB.TXT 
***** .\fileA.txt 
a lc Řçźý§ě ˇ‚ Ô ś ĺ 
a UC ·ć¬ü¦íµÖ Ň › Ő 
***** .\FILEB.TXT 
b lc Řçźý§ě ˇ‚ Ô ś ĺ 
b UC ·ć¬ü¦íµÖ Ň › Ő 
***** 

cmd fix:

D:\test\Unicode> chcp 852 
Active code page: 852 

D:\test\Unicode> fc.exe /U .\fileA.txt .\fileB.txt > .\CompAB_852.txt 

D:\test\Unicode> type .\CompAB_852.txt 
Comparing files .\fileA.txt and .\FILEB.TXT 
***** .\fileA.txt 
a lc ěščřžýáíé ď ť ň 
a UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** .\FILEB.TXT 
b lc ěščřžýáíé ď ť ň 
b UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** 

Dans l'exemple ci-dessus, les deux CompAB_1250.txt (tronqués) et CompAB_852.txt (valide) sont codés dans une page de code d'un octet. Pour obtenir une sortie Unicode, utilisez PowerShell comme suit:

PowerShell fix # 1. Force de PowerShell utiliser la page de code 852 de la ligne de commande (utilisez la commande chcp 852 explicitement avant d'appeler powershell):

D:\test\Unicode> chcp 852 
Active code page: 852 

D:\test\Unicode> powershell -c ". fc.exe /U .\fileA.txt .\fileB.txt > .\CompAB.txt" 

D:\test\Unicode> powershell -c "'CompAB' | ForEach-Object {$_; Get-Content .\$_.txt}" 
CompAB 
Comparing files .\fileA.txt and .\FILEB.TXT 
***** .\fileA.txt 
a lc ěščřžýáíé ď ť ň 
a UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** .\FILEB.TXT 
b lc ěščřžýáíé ď ť ň 
b UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** 

PowerShell fix # 2 force PowerShell d'utiliser la page de code 852à la volée quel que soit le code de console active page et en gardant ce dernier inchangé (par exemple, choisi 1252 page de codes ne contient pas la plupart des lettres utilisées):

D:\test\Unicode> chcp 1252 
Active code page: 1252 

D:\test\Unicode> powershell -c "[System.Console]::OutputEncoding=[System.Text.ASCIIEncoding]::GetEncoding(852);. fc.exe /U .\fileA.txt .\fileB.txt > .\CompAB.txt" 

D:\test\Unicode> powershell -c "'CompAB' | ForEach-Object {$_; Get-Content .\$_.txt}" 
CompAB 
Comparing files .\fileA.txt and .\FILEB.TXT 
***** .\fileA.txt 
a lc ěščřžýáíé ď ť ň 
a UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** .\FILEB.TXT 
b lc ěščřžýáíé ď ť ň 
b UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** 

D:\test\Unicode> chcp 
Active code page: 1252 

S'il vous plaît exécuter les commandes suivante à partir d'une fenêtre ouverte cmd nouvelle pour plus d'explications:

powershell -c "[console]::OutputEncoding" 
chcp 1252 
powershell -c "[console]::OutputEncoding" 
chcp 1250 
powershell -c "[console]::OutputEncoding" 
chcp 852 
powershell -c "[console]::OutputEncoding" 
rem etc. etc. etc. 

Edit (modification): enfin testé avec des caractères grecs ajoutés aux fichiers d'entrée; fc.exe sortie semble bien de la ligne de commande fc.exe /U .\fileA.txt .\fileB.txt ou même de Powershell:

D:\test\Unicode> powershell -c ". fc.exe /U .\fileA.txt .\fileB.txt" 
Comparing files .\fileA.txt and .\FILEB.TXT 
***** .\fileA.txt 
a lc ěščřžýáíé ď ť ň 
a Ελληνικά ΕΛΛΗΝΙΚΆ 
a UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** .\FILEB.TXT 
b lc ěščřžýáíé ď ť ň 
b Ελληνικά ΕΛΛΗΝΙΚΆ 
b UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** 

Cependant, > redirigeant ci-dessus sortie vers un fichier, ainsi que | la tuyauterie dans une autre cmdlet conduit à une perte d'informations pour que certains caractères sont soit tronqués (via mojibake) ou au moins remplacé par ? point d'interrogation, par exemple comme suit:

PS D:\test\Unicode> . fc.exe /U .\fileA.txt .\fileB.txt | ForEach-Object {$_} 
Comparing files .\fileA.txt and .\FILEB.TXT 
***** .\fileA.txt 
a lc ěščřžýáíé ď ť ň 
a ???????? ???????? 
a UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** .\FILEB.TXT 
b lc ěščřžýáíé ď ť ň 
b ???????? ???????? 
b UC ĚŠČŘŽÝÁÍÉ Ď Ť Ň 
***** 
+0

Wow, wow, wow! Merci beaucoup pour votre analyse approfondie! Cependant, si je comprends bien votre (vos) méthode (s), ce n'est pas une "solution Unicode" – newbieforever

+0

Wow, wow, wow! Merci beaucoup pour votre analyse approfondie! Cependant, si je comprends bien votre (vos) méthode (s), ce n'est pas une "solution Unicode". Je n'ai utilisé 'koča' qu'à titre d'exemple. Les fichiers dans 'real life' pourraient contenir des caractères non seulement d'un 'cp 852' mais de l'ensemble de l'Unicode. – newbieforever

+0

@newbieforever il n'y a pas de _ "solution unicode" _ dans 'cmd' car' cmd' n'est pas complètement compatible Unicode et suit fondamentalement [structure CHAR_INFO] (https://msdn.microsoft.com/fr-fr/library/windows /desktop/ms682013(v=vs.85).aspx). Réponse mise à jour – JosefZ