7
votes

Comment fonctionnent les nouveaux types de chaînes dans Delphi 2009/2010?

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.

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.

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?


1 commentaires

Les replays de coderie 4 sont venus en ligne; Voir Delphifeeds.com/go/s/60421 et conférences.embarcadero.com/coderage/sessions


5 Réponses :



8
votes

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.

Je vais couvrir certains encodages et expliquer sur le format de chaîne.

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é ).

éditera cette réponse aujourd'hui avec les ajouts et les liens.


Edit:

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).

matériaux session peut être téléchargé maintenant, y compris le « Utilisation d'Unicode et d'autres codages dans vos programmes » session.

Ce sont des liens de cette session:

Lire celles-ci:

  1. Marco Cantu, Livre blanc « Delphi et Unicode «
  2. Marco Cantu, Présentation « Delphi et Unicode »
  3. Nick Hodges, Livre blanc « Delphi dans un monde Unicode »

    rubriques d'aide pertinentes en ligne:

    1. Nouveautés de Delphi et C ++ Builder 2009
    2. Types de chaîne: base: ShortString, AnsiString , WideString, UnicodeString
    3. Types de chaîne: Unicode (y compris la mémoire interne mises en page des types de chaîne)
    4. Types de chaîne: Activation pour Unicode
    5. Types de chaîne: RawByteString (AnsiString avec CodePage $ FFFF)
    6. Types de chaîne: UTF8String (AnsiString avec CodePage 65001)
    7. Chaîne <-> conversions PChar: PChar fondamentaux
    8. Chaîne <-> conversions PChar: retour une variable locale PChar
    9. Chaîne <-> conversions PChar: Passer une variable locale comme PChar

      Espérons que cela vous arrive d'aller. Sinon, moi un courriel et je vais essayer de prolonger la réponse ici.


9 commentaires

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 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



0
votes

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.

E.g. Code d'initialisation des en-têtes qui chargent la DLL de manière dynamique (GetProCeDureADDRESS / LOADLIBRAY)


0 commentaires

0
votes

Il semble que presque tous mes problèmes proviennent de la conversion automatique des missions à UTF8String .

J'ai déjà eu un ancien code utilisant utf8string juste pour m'aider à penser quel type de chaîne une variable doit contenir.

Lorsque vous commencez à porter mon application, j'ai remplacé ansistring avec utf8string pour la même raison, mais le code dépend de utf8string être juste un alias à (classique) ansistring

Maintenant avec la conversion automatique que l'hypothèse n'est plus vraie, ce qui a créé de nombreux problèmes.

Soyez prudent si vous utilisez utf8string lorsque vous portez du code DelphI pré-2009!


0 commentaires

0
votes

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>


0 commentaires