Autor Téma: Utf8ToAnsi vraci prazdny retezec  (Přečteno 8116 krát)

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #15 kdy: 14-02-2013, 12:51:46 »
Tak uz je to tu zas.
Zas to vraci prazdny retezec. Jako by se na te strance objevovalo neco, co ta funkce nema rada.
Je to nejake podivne.
D2007 Professional

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #16 kdy: 14-02-2013, 13:14:48 »
Tak jsem zjistil touto funkci:
Kód: Delphi [Vybrat]
  1. for I := 0 to stm.Count - 1 do
  2. if utf8toansi(stm[i])='' then showmessage(inttostr(i+1));

Ze to dela radek 70.

www.jarex.cz/mix/zdroj.htm
D2007 Professional

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #17 kdy: 14-02-2013, 15:27:06 »
no nereknu ti pravy duvod, proc co jak ... je to nejakym zmatenim z kodovani,
pouzij tuto funkci, ta ti to prevede spravne

Kód: Delphi [Vybrat]
  1. function UTF8ToStrSmart(Value: String): String;
  2.       function UTF8ToStr(Value: String): String;
  3.       var
  4.         buffer: Pointer;
  5.         BufLen: LongWord;
  6.       begin
  7.         BufLen := Length(Value) + 4;
  8.         GetMem(buffer, BufLen);
  9.         FillChar(buffer^, BufLen, 0);
  10.         MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
  11.         Result := WideCharToString(buffer);
  12.         FreeMem(buffer, BufLen);
  13.       end;
  14.  
  15.  
  16. var
  17.   Digit: String;
  18.   i: integer;
  19.   HByte: Byte;
  20.   Len: Byte;
  21. begin
  22.   Result := '';
  23.   Len := 0;
  24.   if Value = '' then Exit;
  25.   for i := 1 to Length(Value) do
  26.   begin
  27.     if Len > 0 then
  28.     begin
  29.       Digit := Digit + Value[i];
  30.       Dec(Len);
  31.       if Len = 0 then
  32.         Result := Result + UTF8ToStr(Digit);
  33.     end else
  34.     begin
  35.       HByte := Ord(Value[i]);
  36.       if HByte in [$00..$7f] then       //Standart ASCII chars
  37.         Result := Result + Value[i]
  38.       else begin
  39.         //Get length of UTF-8 char
  40.         if HByte and $FC = $FC then
  41.           Len := 6
  42.         else if HByte and $F8 = $F8 then
  43.           Len := 5
  44.         else if HByte and $F0 = $F0 then
  45.           Len := 4
  46.         else if HByte and $E0 = $E0 then
  47.           Len := 3
  48.         else if HByte and $C0 = $C0 then
  49.           Len := 2
  50.         else begin
  51.           Result := Result + Value[i];
  52.           Continue;
  53.         end;
  54.         Dec(Len);
  55.         Digit := Value[i];
  56.       end;
  57.     end;
  58.   end;
  59. end;

PS: tvuj problem je i u me, pri zkoumani myho kodu jsem narazil na tuto funkci, ze sem ji kdysi davno pouzil ;)

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #18 kdy: 14-02-2013, 19:30:28 »
Bohuzel obe funkce mi vyvolavaji exception.
Utf8tostrsmart  "at adress 0040159F Write of adress 00670069
Vetsinou to skonci na teto chybe. Malokdy to projde.


Utf8tostr vyvolava "stack overflow" exception
D2007 Professional

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #19 kdy: 14-02-2013, 19:37:38 »
tak to uz jsem v pasti. me aspon toto fungovalo bez problemu :D

Indy uz mas ty nejnovejsi?

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #20 kdy: 14-02-2013, 19:59:17 »
Ověř si, např. s FastMM ve full debug modu, jestli si někde nepřepisuješ paměť. Přesně tenhle typ záhadných chyb v úplně neškodném kódu jsem dostával v Delphi 5, když jsem string přetypoval na AnsiString (ovšem ne bezprostředně po tom přetypování, ale až někdy později).

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #21 kdy: 14-02-2013, 20:24:56 »
FastMM, hmmm koukam ze se to budu muset nejdriv naucit pouzivat :)
Jinak Indy jsem jeste nepreinstaloval, jelikoz bojim bojim.
D2007 Professional

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #22 kdy: 14-02-2013, 21:20:43 »
na FastMM neni nic tezke, 1 radek v uses :D

Indy a bojim bojim - to me pobavilo, ale neni treba se bat, nejde, aby to neslo :-p

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #23 kdy: 14-02-2013, 21:34:04 »
FastMM jsem stahnul, pridal k projektu a pridal FastMM do dpr jako prvni.
Pustim aplikaci, necham vyvolat tu exception a ze by se mi delal nejaky vypis pred exception nevidim :( Pouze po zavreni aplikace mi vyskoci hlaska "run time error 216 at 0040833D.
D2007 Professional

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #24 kdy: 14-02-2013, 22:08:30 »
FastMM jsem stahnul, pridal k projektu a pridal FastMM do dpr jako prvni.
Pustim aplikaci, necham vyvolat tu exception a ze by se mi delal nejaky vypis pred exception nevidim :( Pouze po zavreni aplikace mi vyskoci hlaska "run time error 216 at 0040833D.

Zkus ten full debug mode. Zkopíruj knihovnu z:

..\FastMMxxxx.zip\FastMM\FullDebugMode DLL\Precompiled\FastMM_FullDebugMode.dll

do adresáře, kde máš binárku a v souboru FastMM4Options.inc změň řádek:

Kód: Delphi [Vybrat]
  1. {.$define FullDebugMode}

na
Kód: Delphi [Vybrat]
  1. {$define FullDebugMode}

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #25 kdy: 14-02-2013, 22:24:03 »
Diky, to pomohlo.  Chyba byla zpusobena pri operaci freemem.
Tedy zde
Kód: Delphi [Vybrat]
  1. FreeMem(buffer, BufLen);
Pise mi to ze blok pameti je pouzivan objektem "neznama trida"

D2007 Professional

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #26 kdy: 15-02-2013, 09:10:42 »
Takze. Udelal jsem si jednoduchou unitu.
Kód: Delphi [Vybrat]
  1. unit Unit3;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, idhttp;
  8.  
  9. type
  10.   TForm3 = class(TForm)
  11.     Button1: TButton;
  12.     Memo1: TMemo;
  13.     procedure Button1Click(Sender: TObject);
  14.     function UTF8ToStrSmart(Value: String): String;
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20.  
  21. var
  22.   Form3: TForm3;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. function Tform3.UTF8ToStrSmart(Value: String): String;
  29.       var
  30.         buffer: Pointer;
  31.         BufLen: LongWord;
  32.       begin
  33.        BufLen := Length(Value) + 4;
  34.        GetMem(buffer, BufLen);
  35.        FillChar(buffer^, BufLen, 0);
  36.        MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
  37.        Result := WideCharToString(buffer);
  38.        FreeMem(buffer, BufLen);
  39.       end;
  40.  
  41.  
  42.  
  43. procedure TForm3.Button1Click(Sender: TObject);
  44. var
  45. s: tstringlist;
  46. a:string;
  47. idhttp: tidhttp;
  48. begin
  49. s:=tstringlist.Create;
  50. idhttp:= tidhttp.Create(nil);
  51. idhttp.HandleRedirects:=true;
  52. idhttp.RedirectMaximum:=5;
  53.  
  54.  
  55. s.text:=idhttp.get('http://www.mimibazar.cz/jankanej');
  56.  
  57. a:=utf8tostrsmart(s.text);
  58. memo1.text:=a;
  59. idhttp.free;
  60. s.free;
  61. end;


A i tady to vyvolava stejnou exception.
Citace
--------------------------------2013/2/15 9:04:25--------------------------------
FastMM detekoval chyby během operace FreeMem . Patička bloku byla poškozena.

Velikost bloku: 49449

Tento blok byl alokován vláknem 0xF68 v okamžiku, kdy zásobník volání obsahoval tyto návratové adresy:
40309A
48607A
486158
44118E
42FF17
430015
440C86
7E3688DA [GetWindowLongW]
773E8EF3 [Unknown function at ImageList_LoadImageA]
773E99CB [Unknown function at ImageList_LoadImageA]
7E3799D8 [NotifyWinEvent]

Blok je aktuálně využíván pro objekt typu: Neznámá třída

Alokační číslo je: 4973

ID aktivního vlákna (thread ID) je 0xF68 a stav na zásobníku volání (návratové adresy) je následující:
4030B6
4860B7
486158
44118E
42FF17
430015
440C86
7E3688DA [GetWindowLongW]
773E8EF3 [Unknown function at ImageList_LoadImageA]
773E99CB [Unknown function at ImageList_LoadImageA]
7E3799D8 [NotifyWinEvent]

Výpis prvních 256 bytů paměti, které začínají na adrese 7FDE8A70:
3C 00 21 00 44 00 4F 00 43 00 54 00 59 00 50 00 45 00 20 00 48 00 54 00 4D 00 4C 00 20 00 50 00
55 00 42 00 4C 00 49 00 43 00 20 00 22 00 2D 00 2F 00 2F 00 57 00 33 00 43 00 2F 00 2F 00 44 00
54 00 44 00 20 00 48 00 54 00 4D 00 4C 00 20 00 34 00 2E 00 30 00 31 00 20 00 54 00 72 00 61 00
6E 00 73 00 69 00 74 00 69 00 6F 00 6E 00 61 00 6C 00 2F 00 2F 00 45 00 4E 00 22 00 3E 00 3C 00
68 00 74 00 6D 00 6C 00 3E 00 0D 00 0A 00 3C 00 68 00 65 00 61 00 64 00 3E 00 0D 00 0A 00 3C 00
74 00 69 00 74 00 6C 00 65 00 3E 00 4E 00 4F 00 56 00 C9 00 20 00 46 00 4F 00 54 00 4F 00 47 00
52 00 41 00 46 00 49 00 45 00 3C 00 2F 00 74 00 69 00 74 00 6C 00 65 00 3E 00 0D 00 0A 00 3C 00
6C 00 69 00 6E 00 6B 00 20 00 72 00 65 00 6C 00 3D 00 22 00 73 00 74 00 79 00 6C 00 65 00 73 00
<  .  !  .  D  .  O  .  C  .  T  .  Y  .  P  .  E  .     .  H  .  T  .  M  .  L  .     .  P  .
U  .  B  .  L  .  I  .  C  .     .  "  .  -  .  /  .  /  .  W  .  3  .  C  .  /  .  /  .  D  .
T  .  D  .     .  H  .  T  .  M  .  L  .     .  4  .  .  .  0  .  1  .     .  T  .  r  .  a  .
n  .  s  .  i  .  t  .  i  .  o  .  n  .  a  .  l  .  /  .  /  .  E  .  N  .  "  .  >  .  <  .
h  .  t  .  m  .  l  .  >  .  .  .  .  .  <  .  h  .  e  .  a  .  d  .  >  .  .  .  .  .  <  .
t  .  i  .  t  .  l  .  e  .  >  .  N  .  O  .  V  .  É  .     .  F  .  O  .  T  .  O  .  G  .
R  .  A  .  F  .  I  .  E  .  <  .  /  .  t  .  i  .  t  .  l  .  e  .  >  .  .  .  .  .  <  .
l  .  i  .  n  .  k  .     .  r  .  e  .  l  .  =  .  "  .  s  .  t  .  y  .  l  .  e  .  s  .
Citace
Po zavreni aplikace mi FastMM vypise:
Citace
Aplikace neuvolnila používanou paměť. Bloky malé velikosti (vyjma chyb registrovaných pomocí ukazatelů):

5 - 12 bytů: TIdThreadSafeInteger x 1
21 - 36 bytů: TIdCriticalSection x 2

Jeto sice par bajtu, ale co kdyby to melo souvislost?

Nekdo nejaky napad, nebo se na to mam vykaslati, ja uz totiz nevim.
D2007 Professional

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #27 kdy: 15-02-2013, 09:39:11 »
ses zblaznil? :D
proc ta tvoje UTF8ToStrSmart ma jen 10 radku? :D :D :D

ta moje pokracovala dal ... asi 60 radku podle voka :D

UTF8ToStr byla jen podfunkce vetsi funkce UTF8ToStrSmart .... chjo ;)
« Poslední změna: 15-02-2013, 09:40:42 od < z > »

Offline jarex

  • Plnoletý
  • ***
  • Příspěvků: 225
  • Karma: 5
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #28 kdy: 15-02-2013, 09:50:34 »
Jaaaa jsem vuuuul. A ja si rikal, proc jsou tam 2 fce. A takhle  jedna ve druhy, Nevedel jsem ze to jde zapsat i takhle..... A ona ta delsi saha do te kratsi :-), kdybych si to poradne prohlidl hned, nemusel jsem tu placat blbosti. To se omlouvam. Alespon kvuli te me blbosti znam FastMM. Diiiiky za vse.

« Poslední změna: 15-02-2013, 10:01:33 od jarex »
D2007 Professional

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Utf8ToAnsi vraci prazdny retezec
« Odpověď #29 kdy: 15-02-2013, 14:04:28 »
"vnorene" funkce se obcas hodi, aby nelitaly nekde mimo ... chybama se clovek uci :)