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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
@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
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. –
Eh bien, je suis coincé, tout comme vous. 'cmd/u' ne semble pas fonctionner! –