我知道,这是一个老问题,但我找到的答案都没有在以下情况中有所帮助:
fc /u TextA.txt TextB.txt
比较两个Unicode编码的txt文件,并在屏幕上正确显示结果(!)。
正如所料,
fc /u TextA.txt TextB.txt > Comp.txt
不会产生Unicode编码文件。
不幸的是,类似情况下使用的方法
cmd /u /c fc /u TextA.txt TextB.txt > Comp.txt
不起作用,生成的文件是ANSI编码的。
我希望这里有人可以提供帮助...
已编辑(在第一条评论之后):问题似乎是cmd /u
(或chcp
)仅适用于“内部”命令(例如dir
)。 fc
不是内部命令......(感谢LotPings!)
答案 0 :(得分:0)
简短回答:
使用PowerShell的Compare-Object
cmdlet,如下所示:
Compare-Object (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt")
基本上自定义输出到文件:
Compare-Object (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt") |
Format-Table -Property SideIndicator, InputObject -AutoSize -HideTableHeaders -Wrap |
Out-File .\fileAB.txt -Encoding unicode
或
Compare-Object (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt") -PassThru |
Out-File .\fileAB.txt -Encoding unicode
原始回答(另请参阅下面的修正):
代码页č
/ U+010D
( 775
字母(拉丁文小写字母C带卡隆,代码点1257
) >波罗的海)和852
/ 1250
(中欧)。我认为后者因为koča
这个词听起来像英语小屋,小屋或小屋的普通斯拉夫语。
重现问题。下一个示例显示了OEM
和ANSI
代码页之间的mojibake个案例;显然,cmd.exe
本身会产生一些隐含的(和不清楚的)字符代码转换:
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
修正:
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
在上面的示例中,CompAB_1250.txt
(乱码)和CompAB_852.txt
(有效)都在一个字节的代码页中编码。要获得Unicode输出,请使用 PowerShell ,如下所示:
PowerShell修复#1 。强制PowerShell
从命令行使用代码页852
(在调用chcp 852
之前显式使用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修复#2 强制PowerShell
动态使用代码页852
,无论活动的控制台代码页如何,并保持后者不变(例如,选择1252
代码页不包含大部分用过的字母):
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
请从新打开的cmd
窗口运行下一个命令以获得进一步说明:
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.
编辑(修正):最后测试了一些希腊字符添加到输入文件中; fc.exe
输出在命令行fc.exe /U .\fileA.txt .\fileB.txt
或甚至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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
但是,>
将上面的输出重定向到文件以及|
将其导入另一个cmdlet会导致信息丢失,从而导致某些字符出现乱码(通过mojibake)或至少用?
问号代替,例如如下:
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****