Hola, amigos,
El otro día estaba intentando hacer un código para extraer el texto de un archivo UNICODE y ponerlo en un TMemo (por ejemplo). Usé los archivos de C:\WINDOWS\inf para probar. El resultado fue exitoso, pero surgieron nuevas dudas:
Diferencia entre UNICODE, UNICODE Big Endian y UTF-8
Además, intenté hacer una función inverse (guardar el texto de un TMemo en un archivo UNICODE). La función está casi hecha, pero tiene un fallo. Aquí estan las dos:
DE ARCHIVO UNICODE A TEXTO ANSI:
Código Delphi
[-]
Function UnicodeToAnsi(FileName: String): String;
type TBloque = array [0..131071] of WideChar;
var
F : File of TBloque;
F2: File of WideChar;
C : TBloque;
C2: WideChar;
P : PWideChar;
Max, Posi, N: Integer;
Fin, S: String;
begin
Result:='';
S:='';
Fin:='';
Max:=0;
Pos:=0;
If not FileExists(FileName) then
begin
raise Exception.Create('El archivo indicado no existe');
exit;
end;
AssignFile(F2, FileName);
Reset(F2);
Max:=FileSize(F2);
CloseFile(F2);
If Max=0 then exit;
AssignFile(F, FileName);
Reset(F);
If FileSize(F)>0 then
for n:=1 to FileSize(F) do
begin
Seek(F, n-1);
Read(F, C);
P:=C;
WideCharToStrVar(P, S);
Fin:=Fin+S;
Fin:=Copy(Fin, 1, Length(Fin)-1);
end;
Posi:=FileSize(F)*131072;
CloseFile(F);
if Posi=Max then
begin
Result:=Copy(Fin, 2, Length(Fin)-1);
Exit;
end;
AssignFile(F2, FileName);
Reset(F2);
for n:=Posi to Max-1 do
begin
Seek(F2, n);
Read(F2, C2);
S:=C2;
Fin:=Fin+S;
end;
CloseFile(F2);
Result:=Copy(Fin, 2, Length(Fin)-1);
end;
GUARDAR TEXTO ANSI EN ARCHIVO UNICODE
Código Delphi
[-]
Procedure AnsiToUnicode(Text, FileName: String);
type
TBloq = array[0..8191]of WideChar;
var
F : File of TBloq;
F2: File of WideChar;
B : TBloq;
W : WideChar;
S : String;
Max, Posi, N: Integer;
begin
Posi:=0;
Max:=Length(Text);
If Max=0 then Exit;
AssignFile(F,FileName);
ReWrite(F);
If Max>8191 then for N:=1 to Max div 8192 do
begin
If N=0 then
begin
S:='_'+Copy(Text,1,8191);
StringToWideChar(S,@B,8192);
B[0]:=WideChar($FEFF);
Write(F,B);
Inc(Posi,8192);
end
else
begin
S:=Copy(Text,(N-1)*8191+1,8192);
StringToWideChar(S,@B,8192);
Write(F,B);
Inc(Posi,8192);
end;
end;
if Posi=Max then
begin
CloseFile(F);
Exit;
end;
CloseFile(F);
AssignFile(F2,FileName);
Reset(F2);
Seek(F2,FileSize(F2));
If Posi=0 then
begin
W:=WideChar($FEFF);
Write(F2,W);
end;
For N:=Posi to Max do
begin
W:=WideChar(Text[n]);
Write(F2,W);
end;
CloseFile(F2);
end;
¿Alguien podría ayudarme a acabar la segunda función?
¿Alguien podría explicarme la diferencia entre UNICODE, Big Endian y UTF-8, y cómo cargar estos archivos en un TMemo?
Muchísimas gracias.