控制台命令&输出到unicode

时间:2016-12-13 21:13:22

标签: unicode cmd windows-console

我知道,这是一个老问题,但我找到的答案都没有在以下情况中有所帮助:

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!)

1 个答案:

答案 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这个词听起来像英语小屋小屋小屋的普通斯拉夫语。

重现问题。下一个示例显示了OEMANSI代码页之间的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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****