Bonjour,

Première fois que je migre un projet D7 en D10 donc de ANSI vers UNICODE
Jusqu'à présent, j'ai migré des bouts de code que j'avais écrit en D3 à D7 vers DXE2, je maîtrisais la fonction, la plupart du temps une lecture de fichier ANSI

Mais je suis confronté à un problème

Le code dont je dispose, à priori D7

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
procedure TxxxForm.btnxxxClick(Sender: TObject);
begin
  memo.Text  := FonctionMaison(AnsiToUtf8(edInput.Text), TRUE);
end;
Exemple : 'é' devient 'é' puis FonctionMaison génère une chaine de longueur 12


Même code en D10, on ignore le warning < W1057 Transtypage de chaîne implicite de 'RawByteString' en 'string' >

Mais la problème
Exemple : 'é' devient 'é' puis c'est reconverti en 'é' puis FonctionMaison génère une chaine de longueur 10

Evidemment, avant, cela traitement deux caractères mais maintenant plus qu'un seul !

Ce qui est encore plus surprenant c'est ceci
on ignore les warnings très nombreux de conversion implicite

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
var
  RBS8: RawByteString;
begin
  RBS8 := UTF8Encode('é');
  Label5.Caption := 'String UTF8 : ' + RBS8;
  Label6.Caption :=  RBS8;
  ShowMessage(RBS8);
Label5 affiche 'String UTF8 : é', ça c'est top ! exactement ce que je veux, cela conserve l'UTF8 sans le reconvertir, génial le LStrCat concatène la constante Ansi et ensuite c'est l'ensemble qui est converti de Ansi vers Unicode, ça me plait mais va exploiter cette étrangeté
Label6 affiche 'é' ... ma question : comment désactiver la conversion implicite UTF8 vers UNICODE, je voudrais voir 'é' ?
ShowMessage affiche 'é'

Bon évidemment, j'ai trouvé une astuce mais il doit bien exister une syntaxe entre AnsiString, UTF8String, RawByteString, UnicodeString pour éviter ça


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
  PStrRec(PByte(RBS8) - SizeOf(StrRec)).codePage := CP_ACP;
  Label8.Caption :=  RBS8;
  ShowMessage(RBS8);
Label8 et ShowMessage affiche correctement mon 'é'

Car oui, je veux passer à FonctionMaison qui ne doit pas être modifié, une chaine UTF8 dans une UnicodeString ...
Donc pas de TBytes ni te TEncoding comme on le pratique avec les TStream

Bon ça c'est si je veux que l'exe D10 et l'exe D7 fasse la même chose, mais je sais que j'ai découvert un loup bien méchant et que le chaperon Rouge que je suis va le manger !