Je dois convertir une grande application héritée à Delphi 2009 qui utilise des chaînes, des anstrings, des widssers et des données UTF8 partout et j'ai du mal à comprendre comment les nouveaux types de chaînes fonctionnent et comment ils doivent être utilisés. < / p>
L'application entièrement prise en charge Unicode à l'aide de tntunicodecontrols et il existe des DLL 3ème partie qui nécessitent des chaînes de codages spécifiques, principalement de l'UTF8 et de l'UTF16, rendant la tâche de conversion non aussi triviale que l'on pourrait soupçonner. P>
J'ai surtout des problèmes avec les appels C DLL C et le choix du bon type. J'ai également l'impression que de nombreuses conversions de chaîne implicites se produisent, car l'une des DLL semble toujours recevoir des chaînes codées UTF-8, quelle que soit la manière dont la chaîne DelphI est codée. P>
Quelqu'un peut-il offrir un bref aperçu des types de chaînes de New Delphi 2009 UNICODESTRING et RAWBYTESTRING, peut-être quelques astuces d'utilisation et des pièges possibles lors de la conversion d'une application PRE 2009? P>
5 Réponses :
voir Delphi et Unicode , un livre blanc écrit par Marco Cantù et je suppose
Le minimum absolu Chaque développeur de logiciel absolument doit connaître de manière positive à propos de Unicode et des ensembles de caractères (aucune excuse!) < / a>, écrit par Joel. P>
Un piège est que l'appel de l'API Win32 par défaut a été mappé pour utiliser la version W (Wide String) au lieu de la version A (ANSI), par exemple Shelexecutea code> si votre code fait un pointeur délicat Code supposant une disposition interne de
ansistring code>, il se cassera. Une baisse consiste à remplacer
pchar code> avec
pansichar code>,
char code> avec
ansichar code>,
chaîne code> avec
Ansistration code> et annoncez A à la fin de l'appel de l'API Win32 pour cette partie du code. Une fois que le code compile et exécute normalement, vous pouvez refroidir votre code pour utiliser
chaîne code> (
unicodetring code>). P>
J'ai posé une question similaire sur Mise à niveau d'une application C ++ Builder 2007 . Tout cela ne sera pas applicable, mais certains des liens et réponses que les personnes donnaient peut être utile pour vous.
Regardez mon CodeRage 4 parler sur « Utilisation d'Unicode et d'autres codages dans vos programmes » ce vendredi , ou attendre jusqu'à ce que la reprise de celui-ci est disponible en ligne. p>
Je vais couvrir certains encodages et expliquer sur le format de chaîne. P>
Les diapositives seront disponibles sous peu (je vais essayer de les obtenir aujourd'hui en ligne) et contiennent beaucoup de références à des choses que vous devriez lire sur Internet (mais je dois admettre que j'oublié le lien vers Joel sur Unicode eed3si9n affiché ). p>
éditera cette réponse aujourd'hui avec les ajouts et les liens. P>
Edit: em> p>
Si vous avez un petit échantillon où vous pouvez montrer que votre C / C ++ DLL reçoit les chaînes UTF8, mais je pensais ils doivent être codés autrement, s'il vous plaît poster (me envoyer un mail, presque tout au Pluimers dot com obtient me , surtout si vous utilisez mon prénom avant le signe). p>
matériaux session peut être téléchargé maintenant, y compris le « Utilisation d'Unicode et d'autres codages dans vos programmes » session. p>
Ce sont des liens de cette session: p>
Lire celles-ci: p>
rubriques d'aide pertinentes en ligne: p>
Espérons que cela vous arrive d'aller. Sinon, moi un courriel et je vais essayer de prolonger la réponse ici. P>
C'est un titre étrange, en considérant que Unicode n'est pas un codage, mais (citer Wikipedia): "Unicode peut être mis en œuvre par différents codages de caractères".
En tant que locuteur anglais non natif, je ne pouvais pas trouver un titre abrégé qui couvre le sujet correctement. Si vous en avez un: laissez-moi savoir. Je serais heureux de changer le titre.
Je ne suis pas un orateur natif non plus, mais je pense que le titre qu'il contient contient une fausse déclaration, et c'est malheureux car il y a trop d'idées fausses sur Unicode. "Utiliser Unicode et choisir des codages ..." serait plus correct. Puisque je ne connais pas votre discours, je ne sais pas si c'est un meilleur titre, cependant.
Merci! Je vais essayer de renommer tout dans "Utilisation d'unicode et de choisir des codages texte / chaînes dans vos programmes".
En tant qu'infrican anglais natif, je pense que le titre va bien. C'est "(en utilisant Unicode) et (autres codages)" pas "à l'aide de (Unicode et d'autres codages)". Ce n'est pas précis, mais c'est la nature de l'anglais, n'est-ce pas? :-)
... ou peut-être "en utilisant (Unicode) et (autres codages)", qui est également d'accord.
Merci pour la liste des bonnes ressources et votre offre généreuse pour m'aider. Mais si j'ai encore des questions, je préférerais leur demander ici, d'autres lecteurs peuvent également profiter de vos connaissances. :)
@Tim: Comment "(en utilisant Unicode) et (d'autres codages)" Bien - n'est-ce pas comme "(manger des pommes) et (autres types de bois)"? L'anglais est-il vraiment que b> imprécise?
Les replays de codérage 4 sont venus en ligne. Pour ce particulier, voir delphifeeds.com/go/s/60421 pour toutes les sessions , voir conférences.embarcadero.com/coderage/sesstions
Notez qu'il n'apporte pas seulement un code de chaîne réel. Il frappe également le code où Pchal est utilisé pour le traduire par des tampons ou une interface avec des API. p>
E.g. Code d'initialisation des en-têtes qui chargent la DLL de manière dynamique (GetProCeDureADDRESS / LOADLIBRAY) P>
Il semble que presque tous mes problèmes proviennent de la conversion automatique des missions à J'ai déjà eu un ancien code utilisant Lorsque vous commencez à porter mon application, j'ai remplacé Maintenant avec la conversion automatique que l'hypothèse n'est plus vraie, ce qui a créé de nombreux problèmes. P>
Soyez prudent si vous utilisez UTF8String code>. p>
utf8string code> juste pour m'aider à penser quel type de chaîne une variable doit contenir. p>
ansistring code> avec
utf8string code> pour la même raison, mais le code dépend de
utf8string code> être juste un alias à (classique)
ansistring code> p>
utf8string code> lorsque vous portez du code DelphI pré-2009! strong> p>
Une autre chose à faire attention lorsque vous passez une chaîne entre DLL construite avec différentes versions de DelphI ou C ++ Builder est que, à commencer par 2009, la partie Strrec d'AnsistringBase a gagné deux champs supplémentaires; codépage et éliminer. Ils sont 2 octets chacun (courts intensions), de sorte que la taille de Strrec est maintenant de 12 octets au lieu de 8. Cela peut entraîner des problèmes d'exception de pointeur non valides avec l'allocation de mémoire et la destruction, même lorsque la partie de données de la chaîne semble transférer OK. < / p>
Les replays de coderie 4 sont venus en ligne; Voir Delphifeeds.com/go/s/60421 et conférences.embarcadero.com/coderage/sessions