Voici un article que j'ai écrit après quelques heures perdues sur un transtypage un peu rapidement fait
http://lookinside.free.fr/delphi.php...ns+les+strings
Voici un article que j'ai écrit après quelques heures perdues sur un transtypage un peu rapidement fait
http://lookinside.free.fr/delphi.php...ns+les+strings
prendez c'est fait exprès ? D'autant plus que "là-bas" c'est bien "prenez"...
Et, à propos de "là-bas", il ne manque pas un « d' », là dans le 2e § ? :(plus un "s" en trop et une espace en moins, au final : Les caractères de l'époque étaient toujours codés sur 8 bits, pas d'ambiguïté possible.)Les caractères de l'époques étaient toujours codés sur 8bits, pas ambiguïté possible.
![]()
Bonjour ! Article très éclairant en effet. Excellent titre, qui plus est.
Il y a une petite correction à faire dans le code : StringCodePage au lieu de StringPageCode.
Autrement, par simple curiosité, quand tu dis qu'à l'offset tant il y a telle donnée, y a-t-il un moyen de le vérifier (par code) ?
Quand tu dis qu'à l'offset -12 on trouve la page de code, par exemple 1200, je pense que j'ai mal compris la phrase, vu qu'il y a autre chose à l'offset -10 et que deux bits ne peuvent pas suffire à représenter la page de code.![]()
Ton article est un tissu d'erreurs:![]()
![]()
Par exemple:
- L'ASCII c'est 7 bits (128 valeurs), donc 1 octet
- Les "code pages" (ou MBCS sous Windows) c'est soit 1 octet (latin-1, latin-9) soit 2 octets (Shift-JIS)
- Les "code pages" sont compatibles ASCII, parce qu'il ne touchent pas aux 128 valeurs de l'ASCII (ils remplissent le trou 7bits <-> 8bits
)
- Le "code page" ANSI c'est un truc bâtard: c'est le code page par défaut de Windows. Mais il change en fonction de la langue de Windows: latin-1 en France, Shift-JIS au Japon, ...
- L’Unicode c'est 3 encodages (mais il y en a eu des dizaines) UTF-8, UTF-16 (*) et UTF-32 (*) (*: big et little endian)
- L'UTF-8, c'est soit 1, 2, 3 ou 4 octets. Il est compatible ASCII
- L'UTF-16 c'est soit 2 octets (Windows) soit 4 octets (Linux). Il n'est pas compatible ASCII (<- en gros, il rajoute des '0' entre chaque caractères
)
- L'UTF-16 c'est l'encodage de Windows (depuis W2K)
- L'API Windows W (wide) a un petit nom, et elle permet de rendre compatible le code "legacy" avant W2K
tu peux le faire comme ceci par exemple
mais l'unité System comprend aussi des fonctions pour cela: StringElementSize, StringCodePage, StringRefCount et Length() évidemment
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 type TStringInfo = record CodePage: Word; CharSize: Word; RefCount: Integer; Length : Integer; end; procedure StringInfo(p: Pointer); var i: ^TStringInfo; begin i := p; // l'adresse du premier caractère Dec(i); // remonter de SizeOf(TStringInfo) en mémoire WriteLn(' CodePage = ', i.CodePage); WriteLn(' CharSize = ', i.CharSize); WriteLn(' RefCount = ', i.RefCount); WriteLn(' Length = ', i.Length); end; begin StringInfo(pointer(Str)); end;
pas deux bits, deux octets![]()
Ah ben crotte alors.... Je me coucherai moins bête ce soir
Attention, méfie-toi ! Il y a très peu d'espace dans un string pour les crottes... D'ici qu'on finisse vraiment par se prendre les pieds dedans...Ah ben crotte alors![]()
Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
. Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !
Partager