2012-05-16 3 views
5

Zanim zacznę, jest problem. Powinno być tak:Znaki A Ę nie Ö wyświetla się w moim DDL, jak mogę powiedzieć reszty klienta, aby użyć określonego zestawu znaków?

Björn Nilsson, zamiast tego wyświetla dziwne znaki specjalne, wszystkie wartości, które mają znaki Å, Ę i Ö, stają się takie.

enter image description here

wypełnić mój DDL z wartościami z API w formacie XML, który ma wszystkie wartości, a my również używając Linq2Rest za to.

To jak proces wygląda

private readonly RestContext<ADConsultants> restContext; 

public ConsultantContext(Uri uri, Format format) 
{ 
    restContext = new RestContext<ADConsultants>(GetRestClient(uri, format), GetSerializerFactory(format)); 
} 
public enum Format 
{ 
    Pox, 
    Json 
} 

private static readonly IEnumerable<Type> knownTypes = new[] {typeof (ADConsultants)}; 

public static IRestClient GetRestClient(Uri uri, Format format) 
{ 
    switch (format) 
    { 
     case Format.Pox: 
      return new XmlRestClient(uri); 
     case Format.Json: 
      return new JsonRestClient(uri); 
     default: 
      throw new NotImplementedException(); 
    } 
} 
private static ISerializerFactory GetSerializerFactory(Format format) 
{ 
    switch (format) 
    { 
     case Format.Pox: 
      return new XmlSerializerFactory(knownTypes); 
     case Format.Json: 
      return new JsonNetSerializerFactory(); 
     default: 
      throw new NotImplementedException(); 
    } 

} 
public IQueryable<ADConsultants> Consultant 
{ 
    get { return restContext.Query; } 
} 

}

To moja klasa JsonNetSerializerFactory:

public class JsonNetSerializerFactory :ISerializerFactory 
{ 
    public ISerializer<T> Create<T>() 
    { 
     return new JsonNetSerializer<T>(); 
    } 
    public class JsonNetSerializer<T> : ISerializer<T> 
    { 
     public T Deserialize(string input) 
     { 
      return JsonConvert.DeserializeObject<T>(input); 
     } 

     public IList<T> DeserializeList(string input) 
     { 
      return JsonConvert.DeserializeObject<IList<T>>(input); 
     } 
    } 
} 

I to w moim kontrolera:

var consultants = new ConsultantContext(
     new Uri("http://adress:port/api/consultants"), 
       ConsultantContext.Format.Json) 
        .Consultant 
        .Where(x => x.Office == "Örebro") 
        .OrderBy(x => x.DisplayName) 
        .ToList() 
        .Select(x => new 
        { 
         name = x.DisplayName 
        }); 

Zrobiłem test w ten sposób:

name = "åäö" 

i to działało dobrze, wartości DDL było „AAO”

Każda pomoc jest mile widziana, jak naprawić więc znaki A A Ö działa dobrze jako wartości w moim DDL .

Nagłówek HTTP to utf-8, moje treści HTML również. Musi to być plik XML, który musi być ustawiony na konkretny zestaw znaków. Jak mogę to zrobić?

Z góry dziękuję!

+0

Jakie jest kodowanie treści Twojego wyjścia? Wygląda na to, że twoja warstwa danych generuje UTF-8, ale warstwa prezentacji deklaruje ją jako inne kodowanie. –

+0

Nie rozumiem twojego pytania, ale używam w całej treści – Obsivus

Odpowiedz

2

w teorii masz problem z kodowaniem/dekodowaniem zestawu znaków.

Przyczyna: treść, którą próbujesz odczytać, została zakodowana przy użyciu zestawu znaków, takiego jak iso-8859-1 lub iso-8859-15. a spróbujesz odczytać (odkodować) bezpośrednio model "UTF-8". Oczywiście nie zadziała, ponieważ UTF-8 nie rozpozna specjalnych znaków w UTF-8 (Ę, Ü,,, itd.). UTF-8 nie jest zgadywaczem do kodowania znaków.

Rozwiązanie:

1- (Re) kodowania treści (np "Bjorn Nilsson") z odpowiednią kodowej (ISO-8859-1/izo-8859-15) do zbierania bajtów.

2- Dekoduj treść za pomocą zestawu znaków "UTF-8".

tutaj klasa Pomocnik jako przykład:

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); 
      } 

     } 
    } 

Zastosowanie:

w (JSON-, XML, inne) zajęcia serializer/Deserializator prostu zamienić zawartość tak

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

możesz spróbować wykonać połączenia w swoim deserializatorze (jeśli naprawdę robią to, co mają na myśli):

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); 
     } 
    } 
} 

to dla

JsonNetSerializerFactory 

spróbuj zrobić to samo dla innych fabryk jak

XmlSerializerFactory 

i nie zapomnij ustawienie w HTML-page

<meta charset="utf-8"> <!--HTML 5 --> 

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- if HTML version < 5--> 
+0

Czy możesz podać mi przykład, w którym w moim kodzie powinienem wpisać SysUtil.StringEncodingConvert (xmlContent, "ISO-8859-1", "UTF-8"); – Obsivus

+0

@RammtinAvar Edytowałem swoją odpowiedź i złożyłem propozycję, gdzie umieścić ją w kodzie. Zauważ, że to może nie działać, ponieważ nie wiem, jak w pełni zakodowałeś swoje rzeczy. daj mi znać, jeśli zawiedzie, aby kontynuować tę rozmowę na czacie. jeśli to działa, nie zapomnij głosować na moją odpowiedź. – arthur

1

Istnieje najprawdopodobniej niedopasowanie między zestawem znaków tekstu i tym, co przeglądarka interpretuje jako zestaw znaków.

Czy masz tag <meta> dla zawartości lub zestawu znaków?

Biorąc pod uwagę zestaw znaków wyślesz jest UTF-8, a używasz HTML5, to byłby odpowiedni tag

<meta charset="utf-8"> 

lub we wcześniejszych wersjach HTML

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

Dla iso-8859-1 lub każdy inny zestaw znaków, wystarczy wymienić atrybut charset.

+0

Mam już w moim układzie – Obsivus

+0

Czy wiesz na pewno, że serwer wysyła dane jako utf-8? Czy próbowałeś powiedzieć przeglądarce, aby wypróbowała inny zestaw znaków? – jurgemaister

+0

Tak, zrobiłem to, czy to może być linq2rest, który je kasuje? – Obsivus

Powiązane problemy