1

我观察到,使用 Visual Studio 2008(使用 .NET 3.5),Console.Out.Encoding如果通过调试器和控制台应用程序/Windows 应用程序以下列方式运行,则更改的值如下:

  • GUI 应用程序 - 使用调试器
    • System.Text.SBCSCodePageEncoding
  • GUI 应用程序 - 不使用调试器
    • System.Text.UTF8Encoding
  • 控制台应用程序 - 使用调试器
    • System.Text.SBCSCodePageEncoding
  • 控制台应用程序 - 不使用调试器
    • System.Text.SBCSCodePageEncoding

现在 whenConsole.Out.Encoding设置为SBCSCodePageEncoding它不会在写入无效 utf16 代理项时引发异常。例如:

string invalidStringContiaingHighOrderSurrogateWithOutMatchingLowOrderSurrogate = '\uD81B'.ToString() + ";";
Console.WriteLine(invalidStringContiaingHighOrderSurrogateWithOutMatchingLowOrderSurrogate);
Console.Out.Flush();

但是,当Console.Out.Encoding设置为System.Text.UTF8Encoding写入无效的 utf16 代理时,它会抛出System.Text.EncoderFallbackException.

我希望能够忽略 EncoderFallbackExceptions 而不必Console.Out在我使用的大型 Windows 应用程序中的每次使用中添加一个 try catch 块。我怎样才能做到这一点?

  1. 更改为控制台应用程序不是可接受的解决方案。
  2. 以某种方式将 Console.Out.Encoding 更改为 SBCSCodePageEncoding 是一种可接受的解决方案。
  3. 我无法更改 Console.Out.Encoding.EncoderFallback,因为我得到以下异常System.InvalidOperationException“实例是只读的”
  4. win32 函数 SetConsoleOutputCP 似乎对我的 GUI/Windows 应用程序没有影响。
4

1 回答 1

1

使用该Console.OutputEncoding属性来设置您想要的编码。

(我个人会坚持使用 UTF-8,但创建一个UTF8Encoding,设置一个适当的EncoderFallback值,例如ReplacementFallback。)

于 2013-09-02T20:09:48.147 回答