2016-05-04 4 views
0

これは私が困惑しています。ロシアのWebサービスにxmlメッセージを送信する必要があります。制限付き(windows-1251)のエンコーディングでxmlの無効な文字をCで停止するには#

public string Serialise(Type t, object o, XmlSerializerNamespaces Namespaces) 
{ 
    XmlSerializer serialiser = _serialisers.First(s => s.GetType().FullName.Contains(t.Name)); 
    Windows1251StringWriter myWriter = new Windows1251StringWriter(); 
    serialiser.Serialize(myWriter, o, Namespaces); 
    return myWriter.ToString(); 
} 

public class Windows1251StringWriter : StringWriter 
{ 
    public override Encoding Encoding 
    { 
     get { return Encoding.GetEncoding(1251); } 
    } 
} 
正常に動作します

が、Webサービスを:XMLは

が、私はさまざまな種類のメッセージに反応するオブジェクトの数を持っていると私は、このようにXMLにそれらを回す窓-1251でエンコードされていますwindows-1251にない文字を送信するとリクエストを拒否します。最新の例では、「左から右への埋め込み」(U + 202A)、「非破壊のハイフン」(U + 2011)と神からの電話番号の送信を試みました。「POP DIRECTIONAL FORMATTING」(U + 202C )。私は入力を制御できません。私は未知の文字を入れたいですか?または削除します。 EncoderFallbackを使いこなそうとしましたが、何も変えていないようです。

私はこれについて間違っていますか?

答えて

2

あなたはstringにシリアライズされているので、Windows1251StringWriterEncodingプロパティは、あなたのためのない唯一のことは、XMLに示すエンコーディングの名前を変更することです:

<?xml version="1.0" encoding="windows-1251"?> 

(私はこのトリックが来ると思いますhere

これだけです。 Encodingプロパティがオーバーライドされているかどうかにかかわらず、すべてのC#文字列は常にutf-16でエンコードされ、基本クラスStringWriterは何に関係なくこのエンコードに書き込みます。

特定のエンコーディングで無効な文字をXMLから取り除くには、バイトストリームにエンコードしてからデコードする必要があります。以下で:

public static class XmlSerializationHelper 
{ 
    public static string GetXml<X>(this X toSerialize, XmlSerializer serializer = null, XmlSerializerNamespaces namespaces = null, Encoding encoding = null) 
    { 
     if (toSerialize == null) 
      throw new ArgumentNullException(); 
     encoding = encoding ?? Encoding.UTF8; 
     serializer = serializer ?? new XmlSerializer(toSerialize.GetType()); 

     using (var stream = new MemoryStream()) 
     using (var writer = new StreamWriter(stream, encoding)) 
     { 
      serializer.Serialize(writer, toSerialize, namespaces); 
      writer.Flush(); 
      stream.Position = 0; 
      using (var reader = new StreamReader(stream, encoding)) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
    } 
} 

その後

var encoding = Encoding.GetEncoding(1251, new EncoderReplacementFallback(""), new DecoderExceptionFallback()); 
return o.GetXml(serialiser, Namespaces, encoding); 
+0

ブリリアント、それはそれに感謝を行っています。 – dibs487

関連する問題