windows cmd管道即使使用/U开关也不是unicode

windows cmd管道即使使用/U开关也不是unicode,unicode,text,cmd,pipe,Unicode,Text,Cmd,Pipe,我有一个小小的c#控制台程序,它使用console.WriteLine输出一些文本。然后,我将此输出导入一个文本文件,如: c:myprogram>textfile.txt 但是,即使我使用/u开关启动cmd,该文件始终是ansi文本文件。 cmd/?关于/u开关: /U导致内部输出 管道或文件的命令应为Unicode 当我做一个实验的时候,它确实会产生不同 c:echo“foo”>text.txt text.txt是unicode(不带BOM) 我想知道为什么将控制台程序的输出管道化到一个新文

我有一个小小的c#控制台程序,它使用console.WriteLine输出一些文本。然后,我将此输出导入一个文本文件,如:

c:myprogram>textfile.txt

但是,即使我使用/u开关启动cmd,该文件始终是ansi文本文件。 cmd/?关于/u开关:

/U导致内部输出 管道或文件的命令应为Unicode

当我做一个实验的时候,它确实会产生不同

c:echo“foo”>text.txt

text.txt是unicode(不带BOM)

我想知道为什么将控制台程序的输出管道化到一个新文件中不会创建一个类似的unicode文件,我该如何更改它

我只是使用WindowsPowerShell(它生成一个具有正确BOM的unicode文件),但我仍然想知道如何使用cmd


谢谢

如文档所述,/U开关会影响内部命令是否生成Unicode输出。您的程序不是cmd.exe的内部命令之一,因此/U选项不会影响它

要创建Unicode文本文件,需要确保程序正在生成Unicode文本


尽管如此,这可能还不够。我无意中看到了如何在控制台程序中编写Unicode文本。它检查标准输出句柄的文件类型。对于字符文件(控制台或LPT端口),它调用WriteFileW。对于所有其他类型的句柄(包括磁盘文件和管道),它将输出字符串转换为控制台的当前代码页。不过,恐怕我不知道如何将其转换为.Net术语。

我了解了mscorlib如何实现Console.WriteLine,它似乎根据对的调用来决定要使用哪种文本输出编码。因此,我猜测(但尚未确认)返回的代码页对于PS控制台和cmd控制台是不同的,因此我的程序实际上只在从cmd运行时输出ansi

是的,我想你已经了解了一些。控制台代码页由
SetConsoleOutputCP
设置。您可以将其设置为所需的值—PS将其设置为Unicode,如果您希望使用P/Invoke,也可以这样做。