C# 当Console.Out.Encoding为UTF8时,如何忽略无效utf16代理引起的encoderCallbackException?

C# 当Console.Out.Encoding为UTF8时,如何忽略无效utf16代理引起的encoderCallbackException?,c#,unicode,utf-16,console-output,C#,Unicode,Utf 16,Console Output,我观察到,使用Visual studio 2008(使用.NET 3.5)时,Console.Out.Encoding的值会根据通过调试器和控制台应用程序/Windows应用程序以以下方式运行的if而变化: GUI应用程序-使用调试器 System.Text.SBCSCodePageEncoding GUI应用程序-不使用调试器 System.Text.utf8编码 控制台应用程序-使用调试器 System.Text.SBCSCodePageEncoding 控制台应用程序-不使用

我观察到,使用Visual studio 2008(使用.NET 3.5)时,
Console.Out.Encoding
的值会根据通过调试器和控制台应用程序/Windows应用程序以以下方式运行的if而变化:

  • GUI应用程序-使用调试器
    • System.Text.SBCSCodePageEncoding
  • GUI应用程序-不使用调试器
    • System.Text.utf8编码
  • 控制台应用程序-使用调试器
    • System.Text.SBCSCodePageEncoding
  • 控制台应用程序-不使用调试器
    • System.Text.SBCSCodePageEncoding
现在,当
Console.Out.Encoding
设置为
SBCSCodePageEncoding
时,当向其写入无效的utf16代理时,不会引发异常。例如:

string invalidStringContiaingHighOrderSurrogateWithOutMatchingLowOrderSurrogate = '\uD81B'.ToString() + ";";
Console.WriteLine(invalidStringContiaingHighOrderSurrogateWithOutMatchingLowOrderSurrogate);
Console.Out.Flush();
但是,当
Console.Out.Encoding
设置为
System.Text.UTF8Encoding
向其写入无效的utf16代理时,将抛出
System.Text.encoderCallbackException

我希望能够忽略EncoderCallbackExceptions,而不必在我使用的大型windows应用程序中每次使用
Console.Out
时都添加try-catch块。我该怎么做

  • 更改为控制台应用程序不是可接受的解决方案
  • 不知何故,将Console.Out.Encoding更改为sbcscodepagencoding是一个可接受的解决方案
  • 我无法更改Console.Out.Encoding.encoderCallback,因为我得到以下异常
    System.InvalidOperationException
    “实例为只读”
  • win32函数SetConsoleOutputCP似乎对我的GUI/Windows应用程序没有影响
  • 使用该属性可以根据需要设置编码

    (就我个人而言,我会坚持使用UTF-8,但是创建一个
    UTF8Encoding
    ,设置一个适当的值,例如…)

    使用属性来设置您想要的编码


    (就我个人而言,我会坚持使用UTF-8,但创建一个
    UTF8Encoding
    ,设置一个适当的值,例如…)

    这不是只适用于控制台应用程序还是我做错了什么?Console.outpunecoding=新的UTF8Encoding();对Windows/GUI应用程序抛出IOException“句柄无效”。这很奇怪。我想这取决于您希望如何处理GUI应用程序中的控制台输出。是否只想将其放在VS的输出窗口中?是的,当在调试器中运行时,输出将用于VS(输出/调试窗口或中间窗口,具体取决于开发人员的设置)-我想我可以在Console.WriteLines之前添加IsDebuggerAttached调用,但这只比在try-catch块中包装好一点。请注意,
    控制台中的编码更改是在.NET 4.0和.NET 4.5中进行的(这些版本也在您链接的第一页的备注部分中提到)。我认为海报使用了.NET3.5。不确定这是否相关。是的-使用.NET3.5,我将更新问题以明确这一点。谢谢,这不是只适用于控制台应用吗?还是我做错了什么?Console.outpunecoding=新的UTF8Encoding();对Windows/GUI应用程序抛出IOException“句柄无效”。这很奇怪。我想这取决于您希望如何处理GUI应用程序中的控制台输出。是否只想将其放在VS的输出窗口中?是的,当在调试器中运行时,输出将用于VS(输出/调试窗口或中间窗口,具体取决于开发人员的设置)-我想我可以在Console.WriteLines之前添加IsDebuggerAttached调用,但这只比在try-catch块中包装好一点。请注意,
    控制台中的编码更改是在.NET 4.0和.NET 4.5中进行的(这些版本也在您链接的第一页的备注部分中提到)。我认为海报使用了.NET3.5。不确定这是否相关。是的-使用.NET3.5,我将更新问题以明确这一点。谢谢