C# 为什么在Windows 8和Windows Server 2012上运行时编码不同

C# 为什么在Windows 8和Windows Server 2012上运行时编码不同,c#,unicode,encoding,utf-8,multipartform-data,C#,Unicode,Encoding,Utf 8,Multipartform Data,我有一个wcf服务,基本上允许人们使用moble应用程序将信息发布到我的Microsoft sql数据库。当我试图发布法语内容时,我感到非常沮丧。i、 e.“Poignée”,我正在使用一个多部分/表单数据解析器(但是,当解析器试图处理dec>128的字符(即单词:Poignée in中的字符)(BinaryReader.Read()BinaryStreamStacks.cs的第283行…如下所示)时,它崩溃了。出现错误:(输出字符缓冲区太小,无法包含解码字符,编码为'Unicode(UTF-8

我有一个wcf服务,基本上允许人们使用moble应用程序将信息发布到我的Microsoft sql数据库。当我试图发布法语内容时,我感到非常沮丧。i、 e.“Poignée”,我正在使用一个多部分/表单数据解析器(但是,当解析器试图处理dec>128的字符(即单词:Poignée in中的字符)(BinaryReader.Read()BinaryStreamStacks.cs的第283行…如下所示)时,它崩溃了。出现错误:(输出字符缓冲区太小,无法包含解码字符,编码为'Unicode(UTF-8)'fallback'System.Text.DecoderReplacementFallback'。\r\n参数名称:chars)

如果我在wcf端的multipart/parser中设置了encoding,使用encoding.GetEncoding(1252)),那么我会设法解决问题,并使用字符串“Poignée”“得到正确的处理,但是,当我试图将其保存到sql数据库时,我首先需要将字符串转换为unicode,然后再将其写入数据库。无论如何,在我的开发机器(Windows 8)上,每个程序都使用这种方法工作。”,问题是,当我将wcf服务发布到2013年服务器时,计算机开始将Poignée另存为PoignÃe。为什么它在我的windows Server 2013计算机上的工作方式与在我的windows 8计算机上的不同?我可以做些什么来修复它

顺便说一句,如果你还没有弄明白,我发现保存法语字符非常令人沮丧


谢谢,

很难解释,BinaryReader初始化看起来很奇怪。说到“字节”在代码中,当你使用返回字符的方法时,肯定是一个危险信号。但在我看来,问题似乎出在电线的另一端。似乎这个移动应用程序以任意编码发送文本。根本无法让你弄清楚正确的编码需要是什么。如果你现在不喜欢法语,请等到东亚在线:)嗨,@HansPassant另一端的移动应用程序是我写的,所以我可以完全控制它。我正在将我的字符串utf-8从其中转换过来。。i、 e.
QHttpMultiPart*multiPart=新的QHttpMultiPart(QHttpMultiPart::FormDataType);QHttpPart文本部分;setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“psPostAdContactBBM\”));textPart.setBody(psPostAdContactBBM.toUtf8());多部分->附加(文本部分)
 public byte[] ReadByteLine(out bool hitStreamEnd)
    {
        hitStreamEnd = false;
        if (!this.HasData())
        {
            // No streams, no data!
            return null;
        }

        // This is horribly inefficient, consider profiling here if
        // it becomes an issue.
        BinaryReader top = this.streams.Peek();
        byte[] ignore = this.CurrentEncoding.GetBytes(new[] { '\r' });
        byte[] search = this.CurrentEncoding.GetBytes(new[] { '\n' });
        int searchPos = 0;
        var builder = new MemoryStream();

        while (true)
        {
            // First we need to read a byte from one of the streams
            int b = top.Read();  //  error occurs here...