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