windows cmd管道即使用/ U开关也不是unicode
题
我有一个小的c#控制台程序,它使用Console.WriteLine输出一些文本。然后我将此输出传递给文本文件,如:
c:myprogram> TextFile.txt的代码>
但是,即使我使用/ u开关启动cmd,该文件也始终是ansi文本文件。 cmd /?关于/ u开关说:
/ U导致内部输出 管道或文件的命令是Unicode
当我做
时,它确实有所作为 c:echo“foo” >的text.txt 代码>
text.txt是unicode(没有BOM)
我想知道为什么将我的控制台程序的输出汇总到一个新文件同样不会创建一个unicode文件,我怎么能改变它?
我只使用Windows Power Shell(生成具有正确BOM的unicode文件),但我仍然想知道如何使用cmd。
谢谢!
解决方案
正如文档所述,/ U开关会影响内部命令是否生成Unicode输出。您的程序不是cmd.exe的内部命令之一,因此/ U选项不会影响它。
要创建Unicode文本文件,您需要确保您的程序正在生成Unicode文本。
尽管如此,这可能还不够。我遇到了来自Junfeng Zhang的这篇博客,描述了在控制台程序中编写Unicode文本。它检查标准输出句柄的文件类型。对于字符文件(控制台或LPT端口),它调用WriteFileW。对于所有其他类型的句柄(包括磁盘文件和管道),它将输出字符串转换为控制台的当前代码页。我担心我不知道这会如何转化为.Net术语。
其他提示
我看看mscorlib如何实现Console.WriteLine,它似乎根据对 GetConsoleOutPutCP 。因此我猜测(但尚未确定)返回的代码页对于PS控制台而言是一个不同于cmd控制台的代码页,因此我的程序确实只在从cmd运行时输出ansi。