Envoyé par
elmin
j'essaie les manip mais hummmm
est-il au moins possible de convertir le fichier même en ANSI avant la lecture en utilisant delphi?
Quel manip, vous avez plusieurs approches, fournissez votre code, là, on avance pas !
Je ne comprends pas la question
Si vous avez un fichier UTF8, vous pouvez le lire en Delphi mais il faut savoir ce que l'on, surtout si il n'y a pas de BOM
Vous pouvez utiliser TEncoding si vous avez besoin d'une TStringList ensuite
1 2 3 4 5 6 7 8 9
| var SL := TStringList.Create();
try
LoadFromFile(OpenDialog1.FileName, TEncoding.UTF8); // fonction native, faut juste lire la documentation !
for var S in SL do
if Length(S) > 0 then
ListBox1.Items.Add(copy(S , 243, 5));
finally
SL.Free();
end; |
la fonction file_get_contents_utf8 fournie par Paul Toth est le cas évoqué par TFileStream.
A savoir, que l'affectation d'une UTF8String dans une string devrait provoquer une conversion implicite
Plus difficile à manipuler par la suite sauf à la repasser en TStringList mais cela aurait pu être fait plus efficacement.
Par exemple
ListBox1.Items.Text := file_get_contents_utf8(OpenDialog1.FileName);
Evidemment, vous devrez faire une TStringList intermédiaire, si votre but n'est de conserver que les 243ème à 248ème caractère, attention d'ailleurs, en UTF8, il faut compenser le cas de multi-octet, le plus simple serait de laisser la conversion vers unicide se faire puis de traiter les chaines converties
1 2 3 4 5 6 7 8 9
| with TStringList.Create() do
try
Text := file_get_contents_utf8(OpenDialog1.FileName); // UTF8String converti implicitement en UTF16.
for var i := 0 to Count - 1 do
if Length(Strings[I]) > 0 then
ListBox1.Items.Add(copy(Strings[I], 243, 5));
finally
Free();
end; |
ou chanceux que tu es en D11 avec le var inline qui rend le with presque obsolète (déjà il manque une sorte de WithIt pour écrire un for var S in WithIt)
1 2 3 4 5 6 7 8 9
| var SL := TStringList.Create();
try
Text := file_get_contents_utf8(OpenDialog1.FileName); // UTF8String converti implicitement en UTF16.
for var S in SL do
if Length(S) > 0 then
ListBox1.Items.Add(copy(S , 243, 5));
finally
SL.Free();
end; |
J'ai D11.r2 depuis peu, je n'ai pas testé le code ci-dessus mais je suis impatient de pouvoir écrire ce genre de chose prochainement (pour le fun car ça coupe toute rétro-compatibilité)
Concept différent à file_get_contents_utf8, on lit le fichier et l'on récupère une chaine décodée unicode à partir de la donnée brute ANSI, UTF8, ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| function SLTLoadFromFile(const AFileName: string; ADefaultEncoding: TEncoding = nil): string;
var
VFileStream: TFileStream;
VSize: Integer;
VPreamble: TBytes;
VPreambleSize: Integer;
VEncoding: TEncoding;
VMemStream: TBytesStream;
begin
if not Assigned(ADefaultEncoding) then
ADefaultEncoding := TEncoding.ANSI;
VFileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite) ;
try
SetLength(VPreamble, 4); // 2 pour UTF-16, 3 pour UTF-8 et 4 pour UTF-32
VPreambleSize := VFileStream.Read(VPreamble, 4);
if VPreambleSize >= 2 then
begin
VEncoding := nil;
VPreambleSize := TEncoding.GetBufferEncoding(Copy(VPreamble, 0, VPreambleSize), VEncoding, ADefaultEncoding);
VSize := VFileStream.Size - VPreambleSize;
end
else
begin
VEncoding := ADefaultEncoding;
VPreambleSize := 0;
VSize := VFileStream.Size;
end;
VFileStream.Seek(VPreambleSize, soBeginning);
VMemStream := TBytesStream.Create();
try
VMemStream.CopyFrom(VFileStream, VSize);
Result := VEncoding.GetString(VMemStream.Bytes);
finally
VMemStream.Free();
end;
finally
VFileStream.Free;
end;
end; |
Partager