Odczytanie Unicode

0

Hej!!! Chcę wczytać plik, zakodowany jako unicode. Otwieram go w notatniku i jest ok. Ale chcę go przetworzyć w delphi. Więc działamy : assignfile, reset, readln closefile...- przypisuję sobie linia po lini (przed closefile ;) ) do memo1 i dostaje same krzaczory. Po prostu delphi odczytuje go jako ascii a nie unicode - przez co nie moge go odczytać właściwie. Pomocy!! Co robić ??

0

Stworzyłem taką funkcję:

function dekoduj(NazwaPliku:string): string;
var Plik: TextFile;
    Znak: char;
    Temp: string;
    WS: UTF8String;
begin
  AssignFile(Plik,NazwaPliku);
  Reset(plik);
  repeat
    Read(Plik,Znak);
    WS := WS + Znak;
  until EOF(Plik);
  CloseFile(Plik);

  SetLength(Temp, Length(WS) * 3);
  UnicodeToUtf8(PChar(Temp), Length(Temp) + 1, PWideChar(WS), Length(WS));
  Temp := UTF8ToAnsi(Temp);

  Result := Temp;
end;

Jako parametr funkcji podajesz nazwę pliku który chcesz zdekodować, funkcja zwraca tekst już zdekodowany.
Niestety nie działa ona idealnie, nie wiem dlaczego jak na razie :/ może ktoś podpowie ;)
Jednak to wystarczy w większości przypadków aby poprawnie zdekodować.
Problemy pojawiają się przy małej ilości znaków w pliku (dodaje jakąś końcówkę :/ )

I dodaje znak zapytania na początku.. jeśli się jednak zdecydujesz korzystać z tej funkcji to jak dopiszesz:

Delete(Temp,1,1);

przed Result := Temp;
to będzie Ci usuwać ten znak zapytania ;)

0
Arthan napisał(a)

Stworzyłem taką funkcję:

  UnicodeToUtf8(PChar(Temp), Length(Temp) + 1, PWideChar(WS), Length(WS));

Dlaczego przy Length jest "+ 1"?

0

Szczerze mówiąc to nie wiem :D
Może dlatego że pisałem to w nocy :P a może dlatego, że ten fragment skopiowałem z jakiejś strony bo nigdy wcześniej nie korzystałem z UnicodeToUtf8 i nie wiedziałem jak się z tego korzysta :P
funkcja działała (w miarę) to wrzuciłem ;) poza tym mam od wczoraj Delphi po francusku i może przez to trochę skołowany jeszcze jestem :P
Tak czy inaczej.. tam się podaje maksymalny rozmiar tego co uzyskamy (tak mi się wydaje, bo pomoc też po francusku :P ), więc najważniejsze żeby było nie mniejsze, a że nieco większe komu to przeszkadza? :D

0

Dzięki Arthan, ale funkcja ta konwertuję, polskie znaki,nie ma krzaczków itd, ale ma kłopoty z odczytaniem 'znaku końca lini', skompilowałem i mój plik nie ma końca jeżeli chodzi o szerokość (a jak ma to jest on bardzo daleko >>>>>>).

Najbliżej rozwiązania jest chyba kod :

procedure TForm1.BitBtn1Click(Sender: TObject);
var Handle:THandle;
    c:array[0..255] of char;
    wc:array[0..255] of widechar;
    s:dword;
const CP_LATIN2     = 852;
      CP_ISO8895_2  = 28592;
begin
ZeroMemory(@wc, sizeof(wc));
ZeroMemory(@c, sizeof(c));
Handle:=CreateFile('c:\mix.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if (Handle<>INVALID_HANDLE_VALUE) then
  begin
  s:=GetFileSize(Handle, nil);
  ReadFile(Handle, wc, s, s, nil);
  CloseHandle(Handle);
  MessageBoxW(0, wc, wc, MB_OK);
  Handle:=CreateFile('c:\mix2.txt', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0);
  if (Handle<>INVALID_HANDLE_VALUE) then
    begin
    WideCharToMultiByte(CP_LATIN2, 0, @wc, -1, @c, sizeof(c), nil, nil);
    WriteFile(Handle, c, strlen(c), s, nil);
    WideCharToMultiByte(CP_ISO8895_2, 0, @wc, -1, @c, sizeof(c), nil, nil);
    WriteFile(Handle, c, strlen(c), s, nil);
    CloseHandle(Handle);
    end;
  end;
end;

Działa super, lecz niestety po naciśnięciu ok wywala błąd, zresztą sami zobaczcie.
Plik typu unicode to 'c:\mix.txt'

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