9

我有一个小的 c# 控制台程序,它使用 Console.WriteLine 输出一些文本。然后,我将此输出通过管道传输到一个文本文件中,例如:

c:myprogram > textfile.txt

但是,该文件始终是 ansi 文本文件,即使我使用 /u 开关启动 cmd 也是如此。命令/?说 /u 开关:

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

当我做一个

c:echo "foo" > text.txt

text.txt 是 unicode(没有 BOM)

我想知道为什么将我的控制台程序的输出通过管道传输到一个新文件中不会同样创建一个 unicode 文件,我该如何改变它?

我只是使用 Windows Power Shell(它会生成一个带有正确 BOM 的 unicode 文件),但我仍然想知道如何使用 cmd 来完成它。

谢谢!

4

2 回答 2

6

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

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

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

于 2008-11-12T21:49:15.897 回答
2

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

于 2008-11-12T22:09:23.830 回答