2011-01-28 18 views
5

To jest strzał w ciemność, a ja z góry przepraszam, jeśli to pytanie brzmi jak błądzenie szaleńca.C#, UTF-8 i kodowanie znaków

W ramach integracji z firmą zewnętrzną, potrzebuję kodowania UTF8 informacji o łańcuchach przy użyciu C#, aby można było wysłać je do serwera docelowego za pomocą formularza wieloczęściowego. Problem polega na tym, że odrzucają niektóre z moich zgłoszeń, prawdopodobnie dlatego, że nie koduję poprawnie ich treści.

W tej chwili, próbuję dowiedzieć się, jak myślnik lub łącznik - nie mogę powiedzieć, który jest po prostu patrząc na niego - jest odbierany lub interpretowany przez serwer docelowy jako [email protected]~S (tak, to jest ciąg 5-znakowy i nie przegląda się twoja przeglądarka). I niestety nie mam dostatecznego dostatecznego zrozumienia Encoding.UTF8.GetBytes(), aby wiedzieć, jak korzystać z tablicy bajtów, aby rozpocząć identyfikację miejsca, w którym może leżeć problem.

Jeśli ktoś może udzielić jakichkolwiek wskazówek lub porad, byłbym bardzo wdzięczny. Do tej pory moim jedynym przyjacielem był MSDN i niewiele z tego.

aktualizacji 1 Po kilka kopanie się, że stwierdzono, że za pomocą System.Web.HttpUtility.UrlEncode() do zakodowania DASH postać EM („-”) będzie heks-zakodować je jako „% e2% 80% 94”.

Obecnie wysyłam tę informację w poście HttpWebRequest, z typem treści "application/x-www-form-urlencoded" - czy to właśnie jest przyczyną problemu? A jeśli tak, jaki jest właściwy sposób kodowania serii par nazwa-wartość, których wartości mogą zawierać znaki Unicode, tak, że będzie to zrozumiałe dla serwera oczekującego żądania UTF-8?

+0

Z tego wyniku mogę przypuszczać, że możesz być ascii kodujący wynik utf8 kodowania ema. – Joshua

+0

Nawet przy niewłaściwym kodowaniu jest mało prawdopodobne, aby 1-znakowy kreska mogła zostać przetłumaczona na 5-znakową sekwencję. To prawdopodobnie nie tylko problem z kodowaniem. –

+0

@Joshua: Myślę, że jesteś blisko sedna problemu. Właśnie dodałem aktualizację do mojego pierwotnego wpisu z dodatkowymi informacjami. –

Odpowiedz

3
byte[] test = System.Text.Encoding.UTF8.GetBytes("-"); 

powinno dać

test[0] = 0x2D (45 as integer). 

sprawdzić, czy wysyłanie 0x2D do serwera docelowego.

+1

Wireshark jest pomocny w tego rodzaju sprawach. – Marlon

+0

Nigdy wcześniej nie używałam Wiresharka, ale nasz główny programista ma duże doświadczenie z Fiddler. Zrobię to, jak tylko wrócę do biura - dziękuję za napiwek. –

+0

Wireshark jest bardzo prosty w konfiguracji. Pozwala zobaczyć, jakie pakiety docierają do twojego serwera. Możesz filtrować dane na wiele sposobów, aby nie stracić danych. – Chauncat

1

Może być konieczne dodanie parametru "charset = utf-8" do nagłówka Content-Type. Możesz również chcieć mieć nagłówek Content-Encoding, aby ustawić kodowanie. Nagłówki powinny zawierać:

Treść-typ: wieloczęściowy/formularz-dane; charset = utf-8

W przeciwnym razie serwer internetowy nie będzie wiedział, że twoje bajty są bajtami UTF-8, więc źle je zinterpretuje.

+0

Masz rację, ponieważ obecnie nie definiuję bezpośrednio typu kodowania treści, gdy wysyłam formularz wieloczęściowy. Właśnie wysłałem e-mail do osoby trzeciej, pytając, czy wiedzieli, jaki był domyślny oczekiwany typ zawartości - czy jest to coś, co mogliby łatwo zidentyfikować? Myślę, że działają na serwerach Microsoft (IIS). –

+0

'UTF-8' jest [nie jest prawidłową wartością' Content-Encoding'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11). Ten nagłówek służy do wskazywania sposobu kompresowania ładunku. Nie jest używany do wskazania zestawu znaków. – dkarp

+0

@dkarp ma rację. – Jacob