Unicode na plik utf8

0

Siema ! Może ktoś podać kod źródłowy procedurki zamieniającej plik w kodowaniu unicode na plik tekstowy w formacie UTF8 (Polskie litery, bez żadnych krzaczków). Te kody są już bliskie rozwiązania :

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;

Prawie działa , są problemy z szerokością wyświetlanego tekstu

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('tekstunicode.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('tekstdozapisu.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;

A ten z kolei działa spoko, gdy wyświetla tekst, ale nie zapisuje poprawnie do pliku, ponadto wyrzuca błąd.
Jak ktoś poprawi błędy, będę b. ciekawy odpowiedzi. Pozdro

0

Co do pierwszego kodu - istnieje funkcja UTF8Encode. WS daj jako WideString, zmiennej Temp w ogóle nie potrzebujesz.

0

Dzięki za odpowiedź. Jak daję widestringa z powrotem dostaję krzaczki - możliwe że złe kodowanie (chcp=852). Ale kod już poprawiony -teraz jest ok ;) Tylko jeszcze przetestować trzeba ;)

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