Konwersja znaków

0

Witam,

zna może koś jakiegoś gotowca który by potrafił zamienić w ciągu znaków, znaki nie standardowe na format &#XXXX; gdzie XXXX to kod znaku w UTF8 np. "dzień" na "dzień".

Pozdrawiam!

0

google zna.

0

Jak bym znalazł w gogle to bym tu nie pisał. :-P Po poszukiwaniach w internecie i braku odpowiedzi dochodzę do wniosku że chyba nic takiego nie znajdę. Szkoda :(

0

Bo nawet nie szukałeś i nie kobminowałeś. Wiadomo przecież, że Delphi 7 oraz pewnie nowsze potrafią swoje
formatki zapisywać jako pliki tekstowe, a nie binaria. Wtedy w takich plikach tekstowych na przykład "ą" jest
zastępowane przez #261 i tak dalej. Idąc tym tropem zorientował byś się, że przecież zwykłe znaki, które to
poprzedza się # normalnie mają wartość od 0 do 255, a tutaj jest przecież więcej. Mając to na uwadze jak w
Delphi byś wpisał zmienną C : Char i przypisał mu #261 to otrzymał byś błąd informujący o nieprawidłowych
typach Char oraz WideChar. Idąc tym tropem nawet na tym forum trafił byś na opis, jakże przydatnej funkcji
StringToWideChar. Mając to można już kobinować wiadomo, że PWide jest wskaźnikiem na WideChar, a więc
co nam da C := P^; oraz ShowMessage(IntToStr(Ord(C)));? Tak! W przypadku tekstu 'ą' - kod znaku będzie
wynosił 261. I w ten sposób już krok do napisania funkcji. Może jest i gotowa funkcja na to, lecz ja to jednak
zrobiłem w taki sposób jak poniżej pokazuję. Z tego co testowałem działa ok. Jak widzisz funkcja banalna, w
zasadzie żaden problem - tylko trzeba pamiętać o usunięciu Dispose(P); z przykładu z 4programmers.net, no
ale jak się nie chce pomyśleć to trzeba czekać, aż olesio się zlituje usiądzie i zrobi gotowca ;P Ech, Ci lenie ;/

function StrToUtf8WideChars(Text : string) : string;
var
  S : string;
  I : LongWord;
  C : WideChar;
  P : PWideChar;
begin
  Result := '';
  if Text = '' then
  begin
    Exit;
  end;
  for I := 1 to Length(Text) do
  begin
    S := Utf8Encode(Text[I]);
    if S <> Text[I] then
    begin
      S := Text[I];
      New(P);
      StringToWideChar(S, P, Length(S) + 1);
      C := P^;
      S := '&#' + IntToStr(Ord(C));
    end
    else
    begin
      S := Text[I];
    end;
    Result := Result + S;
  end;
end;

Dodam od razu że w drugą stronę też można konwertować o tak. Funkcję jak potrzebujesz to sobie napisz :P

var
  W : WideChar;
begin
  W := WideChar(StrToInt('261'));
  Caption := W;
end;
0

olesio oczywiście że masz racie że to z lenistwa szukałem gotowca. Myślałem że do czegoś takiego znajdę gotowca bez problemu. Jednak się myliłem. Wielkie dzięki za gotowca mimo że już sobie też napisałem własną funkcję. Całkiem podobną do twojej tylko ja zamiast:

      S := Text[I];
      New(P);
      StringToWideChar(S, P, Length(S) + 1);
      C := P^;
      S := '&#' + IntToStr(Ord(C));

użyłem:

      s := '&#' + IntToStr(Ord(UTF8Decode(s)[1]))+';'; 

Maiłbym jeszcze jedno pytanie zna ktoś jakiś komponent do Delphi 7 Personal który miałby pole memo odsługujące unicoda?

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