C#异常错误编码

C#异常错误编码,c#,exception,encoding,exception-handling,C#,Exception,Encoding,Exception Handling,我开始使用.NETCore,我需要通过npgsql打开数据库连接。代码如下: try { await conn.OpenAsync(); } catch (Exception e) { await Utils.ThrowErrorAsync(session, e.Message); return; } 问题是e.Message位于错误的代码页中(没有变音符号) 有: 28P01:autoryzacja已经�埃姆尼波维德�阿西� dla u�ytkownika postg

我开始使用.NETCore,我需要通过npgsql打开数据库连接。代码如下:

try
{
    await conn.OpenAsync();
}
catch (Exception e)
{
    await Utils.ThrowErrorAsync(session, e.Message);
    return;
}
问题是
e.Message
位于错误的代码页中(没有变音符号)

有:

28P01:autoryzacja已经�埃姆尼波维德�阿西� dla u�ytkownika postgres

但应该是(波兰语):

28P01:autoryzacja拥有一名优秀的博士后

我无法更改此异常的代码页,因此无法将此错误消息字符串化为JSON并重新解析。引发异常:
JSON输入意外结束

所以我的问题是:

1) 是否有可能更改异常的代码页

2) 有没有办法从这个字符串中删除有问题的字符


视为一种解决方法,您可以尝试替换有问题的字符。� 是U+FFFD替换字符,因此以下内容应足够:

var cleanedMessage = e.Message.Replace('�', '?');
如果您的JSON转换遇到任何非ASCII的问题(不应该发生,但此类问题比比皆是),您还可以替换ASCII以外的所有内容:

var cleanedMessage = Regex.Replace(e.Message, "[^\x00-~]", "?");
但是,从根本上说,如果您看到这些字符,那么Npgsql已经做了一些非常错误的事情,理想情况下应该在那里解决这个问题


通过查看该库的源代码,它使用
connector.Settings.Encoding
作为编码来转换从套接字读取的内容。它默认为UTF-8,但在您的情况下显然不是UTF-8,否则您将无法获得这些替换字符。在你的情况下,代码页1250可能是我的猜测,但也许你可以使用
编码。默认值为

@Joey我知道我可以简单地替换这些字符,问题是我无法识别要替换的字符。当然,我可以使用正则表达式[a-zA-Z0-9],但在这种情况下,消息将非常不清楚。当您看到奇数字符时,您在哪里/如何检查该字符串?我这样问是因为字符串本身可能完全没有问题,但是通过http请求、日志文件或类似的方式传输给您可能会把事情搞砸。@LasseVågsætherKarlsen:我强烈猜测异常消息已经被接收(并被解析)从连接到Postgres本身,因此是连接器损坏了它,因为编码与数据库服务器使用的编码不同。如果字符串与异常中的字符串类似,那么是的,是异常的生成以及代码从何处/如何获取错误字符串。