SOAP, UTF8 i polskie znaki

0

Pracuję właśnie nad aplikacją SOAPową. Wszystko generalnie działa poprawnie - komunikaty latają tam i z powrotem - co do tego nie mam żadnych zastrzeżeń.

Problem w tym, że z serwera dostaję konkretne komunikaty błędów po polsku. Niestety nie umiem poradzić sobie z konwersją z UTF8 na cokolwiek, co można by wyświetlić np. w MessageBoxie - za każdym razem dostaję "krzaki":

Hasło straciło ważność. W celu kontynuowania pracy wymagana jest zmiana hasła.

Próbowałem kilku funkcji konwertujących z UTF8 na WideStringi ale jakoś mi to nie wychodzi.

Pomożecie ?

1

Co masz na myśli pisząc "krzaki" to co podałeś na forum czy tylko forum tak przerobiło?
Jeżeli masz takie coś jak widać na forum to w nowszych Delphi ponieważ obsługuje Unicode wystarczy do uses HTTPApp i:

s:= HTMLDecode(HTMLDecode(s)); //tak 2 x bo najpierw trzeba & zmienić na &

Natomiast w starszych wersjach funkcja z tego modułu się nie sprawdzi właśnie przez brak Unicode zrobi inne krzaki dlatego przerobiłem wyciągniętą ze źródeł HTTPApp z Delphi 7 i ona powinna działać (chyba też w nowszych Delphi też dobrze działa):

function HTMLDecode(const AStr: AnsiString): WideString;
var
  Sp, Cp, TP: PAnsiChar;
  Rp: PWideChar;
  S: AnsiString;
  I, Code: Integer;
begin
  SetLength(Result, Length(AStr));
  Sp := PAnsiChar(AStr);
  Rp := PWideChar(Result);
  Cp := Sp;
  try
    while Sp^ <> #0 do
    begin
      case Sp^ of
        '&': begin
               Cp := Sp;
               Inc(Sp);
               case Sp^ of
                 'a': if AnsiStrPos(Sp, 'amp;') = Sp then  { do not localize }
                      begin
                        Inc(Sp, 3);
                        Rp^ := '&';
                      end;
                 'l',
                 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then { do not localize }
                      begin
                        Cp := Sp;
                        Inc(Sp, 2);
                        while (Sp^ <> ';') and (Sp^ <> #0) do
                          Inc(Sp);
                        if Cp^ = 'l' then
                          Rp^ := '<'
                        else
                          Rp^ := '>';
                      end;
                 'n': if AnsiStrPos(Sp, 'nbsp;') = Sp then  { do not localize }
                      begin
                        Inc(Sp, 4);
                        Rp^ := ' ';
                      end;
                 'q': if AnsiStrPos(Sp, 'quot;') = Sp then  { do not localize }
                      begin
                        Inc(Sp,4);
                        Rp^ := '"';
                      end;
                 '#': begin
                        Tp:= Sp;
                        Inc(Tp);
                        while (Sp^ <> ';') and (Sp^ <> #0) do
                          Inc(Sp);
                        SetString(S, Tp, Sp - Tp);
                        Val(S, I, Code);
                        Rp^ := WideChar(I);
                      end;
                 else
                   Exit;
               end;
           end
      else
        Rp^ := WideChar(Sp^);
      end;
      Inc(Rp);
      Inc(Sp);
    end;
  except
  end;
  SetLength(Result, Rp - PWideChar(Result));
end;

Natomiast jeżeli jest coś innego (właśnie naprawdę UTF8) tylko forum przerobiło to spróbuj wkleić w znacznikach <*code></*code> (bez *) może wtedy nie przerobi i się zobaczy co to jest. Próbowałeś kilku to wypadało by napisać co próbowałeś... Rozumiem UTF8Decode sprawdziłeś w pierwszej kolejności i nie działa.

0

Te &amp dodało forum. W treści komunikatu błędu pojawiają się #322, #347, itd.

Na razie poradziłem sobie w ten sposób, że zamieniam te #322 na "ł" i pozostałe odpowiednio, ale jakaś ta moja metoda taka ... druciarska.

Jeżeli chodzi o HTMLDecode - uzyskałem tyle, że zamiast #322, #347, itp. pojawia się znak "?" w czarnym rombie. Czyli dalej nie uzyskałem polskich znaków "tak-wprost"

Co do funkcji - próbowałem UTF7ToWideString, UTF8ToAnsi, UTF8Decode

0

A jaki kompilator i czy sprawdziłeś funkcją z modułu HTTPApp czy moją przeróbką?

0

XE2

Próbowałem wersją z HTTPApp - Twojej nie zdążyłem jeszcze przetestować - pracuję aktualnie nad innym fragmentem kodu tej aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1