【问题标题】:windows cmd pipe not unicode even with /U switch即使使用 /U 开关,Windows cmd 管道也不是 unicode
【发布时间】:2008-11-12 21:43:48
【问题描述】:

我有一个小的 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 来完成。

谢谢!

【问题讨论】:

    标签: unicode text cmd pipe


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我认为您对此有所了解。
      • 控制台代码页由SetConsoleOutputCP设置。您可以将其设置为您想要的 - PS 将其设置为 Unicode,如果您希望使用 P/Invoke,您也可以这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2018-12-13
      相关资源
      最近更新 更多