Bonsoir à tous
J'ai cherché, mais rien trouvé. Le TStringList est-il une liste de chaînes de type string (short) ou existe-t-il un type de TStringList de WideString? i non, il me faut passer par une TList ?
Merci
Bonsoir à tous
J'ai cherché, mais rien trouvé. Le TStringList est-il une liste de chaînes de type string (short) ou existe-t-il un type de TStringList de WideString? i non, il me faut passer par une TList ?
Merci
Depuis que Delphi est Unicode TStringList est donc Unicode.
petite précision qui a son importance:Depuis que Delphi est Unicode TStringList est donc Unicode.
Il est UNICODE, Oui
Mais seulement depuis la version Delphi 2009
Cordialement,
@+
Donc, selon ce que j'ai lu sur unicode, une TStringList liste des chaînes WideString. C'est bien ça ?
oui mais c'est totalement transparent pour toi.
pour t'en rendre compte tu peux tester ceci:Si ta version est UNICODE la taille réelle sera de 10 (2 fois le nombre de caractères)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 uses SysUtils; ... var Pc: PChar; S: string; begin S:= 'Essai'; Pc := SysUtils.StrAlloc(Length(S)); ShowMessageFmt('Taille de %s = %d caractère(s)'+#13+ 'Taille réelle = %d', [S, Length(S), SysUtils.StrBufSize(Pc)]); SysUtils.StrDispose(Pc); end; ...
et ensuite tu changes PC: PChar en Pc: PAnsiChar pour voir la différence.
tout comme:
SizeOf(Char) == 1 jusqu'à D2007
et
SizeOf(Char) == 2 depuis D2009
Plus globalement
jusqu'à D2007
et depuis D2009
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 string == AnsiString Char == AnsiChar; PChar == PAnsiString;
Cordialement,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 string == WideString Char == WideChar; PChar == PWideString;
@+
Bonjour, et merci
Cela répond à ma question... sans régler mon problème. Mais je sais à présent qu'il n'a rien à voir avec la longueur des chaînes dans un TSTringList.
J'utilise beaucoup le composant JvSerachFiles des Jedi. Et même plusieurs treads. L'un de mes progs qui l'appelle plante aléatoirement. Et uniquement sur le PC-1, la "grande" tour. Pas sur le portable, dont la partition de sauvegarde (sur port USB) ne compte pas la même quantité de répertoires. 32 Go RAM sur le PC-1 : ce n'est pas une saturation de la mémoire. Ce doit être la longueur elle-même des path qui excèdent certaines limites.
J'ai donc bien des TStringList de WideString. Donc, ça ne vient pas de là.
Merci
Petite correction, le TStringLIst n'est pas forcément en Unicode, il peut être an AnsiString.
Bonjour, Alweber.
Ca change quelque chose à la longueur des string ?
Alors oui on peut y ajouter des chaines de type AnsiString mais elles seront implicitement tanstypées en string donc en UNICODEEnvoyé par ALWEBER
sur une instruction du type:le compilateur prévient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part aStringList.Add(AnsiString(s));ça ne change absolument rien !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part [DCC Avertissement] Unit1.pas(249): W1057 Transtypage de chaîne implicite de 'AnsiString' en 'string'
La chaine : 'Essai' vaut 5 en UNICODE comme en Ainsi
mais en mémoire elle occupera le double dans un environnement UNICODE
Cordialement,
@+
String est un alias pour UnicodeString et non WideString (et PChar, PWideChar)
Le type UnicodeString (à l'instar de AnsiString) contient une entête située à PChar -12 dont l'élément principal est le compteur de référence.
En mémoire, "Essai" en ANSI prendra donc 12 +5 +1 (ne pas oublier le 0 terminal) = 18 octets et en Unicode 12 +10 +2 = 24 (on pourrait encore ajouter la variable de type string elle-même, un pointeur)
Et sauf erreur au début de Delphi-Unicode, l'UnicodeString était un type susceptible de contenir une chaîne ANSI ou Unicode. D'où les éléments CodePage et ElemSize dans l'entête (ça a été abandonné depuis).
Je rectifie il y a bien conversion en Unicode dans le TStringList depuis un certain nombre de versions de Delphi.
Lors du saveToFile il régénère s'il y a lieu de l'ANSIString mais qui n'est pas forcément identique au fichier chargé.
En complément :
Voici un jeu de test avec du cyrillique
ABCD
ЁЂЃЄ
EFGH
ЅІЇЈ
Flux initial :
EF BB BF // entete indication UTF8
41 42 43 44 0D 0A // ligne ansi
D0 81 D0 82 D0 83 D0 84 0D 0A // ligne cyrillique
45 46 47 48 0D 0A // ligne ansi
D0 85 D0 86 D0 87 D0 88 0D 0A // ligne cyrillique
Une fois chargé dans le TStringlist chaque ligne est en format unicodeString
Les caractères en Ansi UTF8 codé sur un octet dans le fichier sont convertis en unicodeString
Les caractères en cyrillique UTF8 "Little Indian" dans le fichier sont convertis dans un autre format UTF 16
D0 81 => 01 04
D0 82 => 02 04 et ainsi de suite
Voici les 4 lignes du stringList - Les huits premiers octets de chaque ligne donnent des informations sur le contenu de la ligne
01 00 00 00 04 00 00 00 41 00 42 00 43 00 44 00
01 00 00 00 04 00 00 00 01 04 02 04 03 04 04 04
01 00 00 00 04 00 00 00 45 00 46 00 47 00 48 00
01 00 00 00 04 00 00 00 05 04 06 04 07 04 08 04
Fonctions utilisées pour visualiser :
Appel de la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 function VisuXOctets(pDepart : pointer; nbOctet : integer = 64 ): string; var pb1: ^byte; i1, i2 : integer ; st1 : string ; begin result := '' ; pb1 := pDepart ; for i1 := 1 to (nbOctet div 8) do begin st1 := ''; for i2 := 1 to 8 do begin st1 := st1 + ' ' + intToHex(pb1^, 2); inc(pb1); end; result := result + st1 + #13#10 end; end; function Visu(stTitre: string; p1: pointer; decalage: integer): string; var pb1: ^byte; begin pb1 := pointer(integer(p1) + decalage); result := '-- ' + stTitre + ' --' + #13#10 + VisuXOctets(pb1, 24); end;
Ce qui veut dire voir à partir du 8ème octet précédant le premier caractère du premier élément de la liste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Visu('dans TStringlist :', @sl1[0][1], -8);
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager