2014-04-09 169 views
2

当我尝试从文件中反序列化一个对象时,它将土耳其字符(如“?”)转换为问号。JSON.Net DeserializeObject文本编码

所以尝试这样做:

JsonConvert.DeserializeObject<List<MyClass>>(json, new JsonSerializerSettings() 
{ Culture = new System.Globalization.CultureInfo("tr-TR") }); 

,但没有奏效。有没有办法改变Json.Net中的字符编码?

+0

的resut这可能有助于 HTTP: //stackoverflow.com/questions/10615072/characters-is-not-getting-displayed-in-my-ddl-how-can-i-tell-restclient-t – csharpwinphonexaml

回答

3

在理论上你有一个charset编码/解码问题。

原因:您试图读取的内容已使用类似iso-8859-1或iso-8859-15的字符集编码。并且您将尝试直接读取(解码)到“UTF-8”字符模型。当然,UTF-8不会工作,因为UTF-8不会奇迹般地识别你的特殊字符(Ä,Ü,Ö等等)。 UTF-8不适用于字符编码。

解决方案

1-(重新)编码您的内容(如 “比约恩·尼尔森”)及其相应的字符集(ISO-8859-1/ISO-8859-15)为字节的集合。

2-将您的内容解码为基于“UTF-8”的字符集。

这里的助手类为例:

using System; 
using System.Collections.Generic; 
using System.Text; 

    namespace csharp.util.charset 
    { 
     public class SysUtil 
     { 
      /// <summary> 
      /// Convert a string from one charset to another charset 
      /// </summary> 
      /// <param name="strText">source string</param> 
      /// <param name="strSrcEncoding">original encoding name</param> 
      /// <param name="strDestEncoding">dest encoding name</param> 
      /// <returns></returns> 
      public static String StringEncodingConvert(String strText, String strSrcEncoding, String strDestEncoding) 
      { 
       System.Text.Encoding srcEnc = System.Text.Encoding.GetEncoding(strSrcEncoding); 
       System.Text.Encoding destEnc = System.Text.Encoding.GetEncoding(strDestEncoding); 
       byte[] bData=srcEnc.GetBytes(strText); 
       byte[] bResult = System.Text.Encoding.Convert(srcEnc, destEnc, bData); 
       return destEnc.GetString(bResult); 
      } 

     } 
    } 

用法:

(JSON-,XML等)串行器/解串器类只是将您的内容一样,

String content = "Björn Nilsson"; 
SysUtil.StringEncodingConvert(content, "ISO-8859-1","UTF-8"); 

你可以尝试在你的解串器中打你的电话(如果他们确实按照他们的意思):

public class JsonNetSerializerFactory :ISerializerFactory 
{ 
    public ISerializer<T> Create<T>() 
    { 
     return new JsonNetSerializer<T>(); 
    } 
    public class JsonNetSerializer<T> : ISerializer<T> 
    { 
     public T Deserialize(string input, String fromCharset, String toCharset) 

     { 
      String changedString = SysUtil.StringEncodingConvert(input, fromCharset,toCharset); 

      return JsonConvert.DeserializeObject<T>(changedString ); 
     } 

     public IList<T> DeserializeList(string input, String fromCharset, String toCharset) 
     { 
     String changedString = SysUtil.StringEncodingConvert(input, fromCharset,toCharset); 

      return JsonConvert.DeserializeObject<IList<T>>(changedString); 
     } 
    } 
} 
17

如果您使用WebClient,请确保在创建它时在WebClient上声明UTF-8。

new WebClient() { Encoding = Encoding.UTF8 } 
+1

我已经看到了很多复杂的解决方案,但最简单的解决方案帮助了你!谢谢 –