控制台命令及;输出到unicode

控制台命令及;输出到unicode,unicode,cmd,windows-console,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编码的 我希

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

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

简短回答:

按如下方式使用PowerShell:

Compare-Object  (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt")
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
基本上自定义文件输出:

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

原始答案(另见下文修正案):

č
字母(拉丁文小写字母C随以卡隆,代码点
U+010D
)出现在代码页
775
/
1257
(波罗的海)和
852
/
1250
(中欧)中。我认为后者是
koča
这个词听起来像是英语小屋、小屋或小屋的常用斯拉夫语术语

重现问题。下一个示例显示了
OEM
ANSI
代码页之间的可能情况;显然,
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
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
在上面的示例中,
CompAB_1250.txt
(乱码)和
CompAB_852.txt
(有效)都编码在一个单字节代码页中。要获得Unicode输出,请按如下方式使用PowerShell

Compare-Object  (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt")
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
PowerShell修复程序#1。强制
PowerShell
从命令行使用代码页
852
(在调用
PowerShell
之前明确使用
chcp 852
命令):

PowerShell fix#2强制
PowerShell
动态使用代码页
852
,而不考虑激活的控制台代码页,并保持后者不变(如图所示,选择的
1252
代码页不包含大多数使用的字母):

请从新打开的
cmd
窗口运行next命令以获取进一步解释:

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会导致信息丢失,从而导致某些字符被乱码(via)或至少替换为
问号,例如:

Compare-Object  (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt")
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****

简短回答

按如下方式使用PowerShell:

Compare-Object  (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt")
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
基本上自定义文件输出:

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

原始答案(另见下文修正案):

č
字母(拉丁文小写字母C随以卡隆,代码点
U+010D
)出现在代码页
775
/
1257
(波罗的海)和
852
/
1250
(中欧)中。我认为后者是
koča
这个词听起来像是英语小屋、小屋或小屋的常用斯拉夫语术语

重现问题。下一个示例显示了
OEM
ANSI
代码页之间的可能情况;显然,
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
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
在上面的示例中,
CompAB_1250.txt
(乱码)和
CompAB_852.txt
(有效)都编码在一个单字节代码页中。要获得Unicode输出,请按如下方式使用PowerShell

Compare-Object  (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt")
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****
PowerShell修复程序#1。强制
PowerShell
从命令行使用代码页
852
(在调用
PowerShell
之前明确使用
chcp 852
命令):

PowerShell fix#2强制
PowerShell
动态使用代码页
852
,而不考虑激活的控制台代码页,并保持后者不变(如图所示,选择的
1252
代码页不包含大多数使用的字母):

请从新打开的
cmd
窗口运行next命令以获取进一步解释:

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会导致信息丢失,从而导致某些字符被乱码(via)或至少替换为
问号,例如:

Compare-Object  (Get-Content ".\fileA.txt") (Get-Content ".\fileB.txt")
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 ĚŠČŘŽÝÁÍÉ Ď Ť Ň
*****

@法布:第一个例子没有区别,第二个似乎语法不正确我不知道如何在这里发布文件。。。但是你可以简单地在记事本中写一个单词,然后用Unicode保存文件,第二个文件也是如此,然后看看Comp.txt是Unicode还是ANSI编码的。嘿,你说得对!别忘了谁解决了这里的问题:)非常好的观点。我应该得到一点东西。我和你一样被困住了
cmd/u
似乎不起作用@Jean-Françoisfare
cmd/?
声明
/U导致**内部**命令输出到管道或文件为Unicode
IMO Fc.exe不是内部命令。最终,即使输出为UTF8,这也会有所帮助,您可以将UTFSeems转换为自己的风格,就像
fc
中的缺陷一样。我不确定你能做些什么。@Fabre:第一个例子没什么区别,第二个似乎语法不正确。-我不知道怎么邮寄