IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[i18n] String, OleVariant, TFontCharset...pas d'accents [FAQ]


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 17
    Points
    17
    Par défaut [i18n] String, OleVariant, TFontCharset...pas d'accents
    Bonjour a tous

    J'ai pas mal cherche (FAQ, Forum, Google), mais j'ai pas trouve donc je poste:
    Je suis sur un PC avec XP en japonais et j'utilise la version US de delphi.

    Et je n'arrive pas a afficher les accents dans mon application. Par exemple si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label1.Caption:=MonTexte;
    le label n'affiche pas d'accents, alors que MonTexte contient ces accents (il "remplace" la lettre accentuee par la meme lettre sans son accent). Alors voici jusqu'a present ce que j'ai essaye:
    - Tous les TFontCharset disponibles
    - Plusieurs Font dont je suis sur qu'elle ont ces accents
    - Plusieurs pages de code dans les options du projet.

    Plus precisement, mon texte vient d'un fichier XML (TXMLDocument). Et la c'est assez bizarre car si je lis IXMLNode.Text (string), les accents sont supprimes. Par contre avec IXMLNode.NodeValue (OleVariant), pas de probleme.

    Du coup j'ai l'impression que mon systeme ne peut stocker d'accents dans une string de base. Mon probleme c'est que toute les proprietes Caption ou Text des compo VCL sont des string...

    Voila a peu pres, a noter que j'ai teste de lancer l'appli sur un PC avec windows US, et le resultat est le meme (mais j'ai pas recompile l'appli sur ce PC...)
    Enfin un autre truc que je comprends pas c'est que j'ai aucun pb avec les caracteres asiatiques (a condition que je selectionne le bon TFontCharset bien entendu). Je n'ai pas teste avec des caracteres scandinaves ou autre car je suis deja suffisament perdu comme ca.

    Mon but final est que mon appli puisse afficher, en meme temps, du francais, du chinois et de l'arabe, pas exemple (IE, Opera, Wordpad et autres le font sans probleme)

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Quelle version de Delphi ?

    Car pour D2005 il me semble qu'il bosse en unicode donc il ne devrait pas y avoir de pb.

    En revanche pour les versions précédentes il faut utiliser les controls TNTUnicode ( http://www.tntware.com/delphicontrols/unicode/ ).

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Delphi 7. Je me disais bien que Delphi ne gerai pas, a cause des options de projets: oblige de selectionner une langue (pas d'unicode dans la liste)

    Bon je vais tester les TNT composants, et je reposterai pour vous donner mes impressions (si j'oublie pas...)

    Merci du conseil en tout cas.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Bon alors j'ai essaye les compo TNT, et ca marche bien.

    Ce qui est cool aussi c'est qu'on peut facilement faire un echange "standard" avec les compo de base de la VCL, donc l'adaptation est rapide.

    Par contre il me reste un petit probleme:
    Comme j'expliquais plus haut, je lis des chaines de caracteres depuis un fichier XML, ce sont donc des OleVariant.
    Si je sauvegarde ces OleVariant dans un WideString, je perds encore les accents...deja je comprends pas pourquoi car l'aide du delphi dit que les WideString sont censes etre Unicode.
    Donc, pour afficher correctement ces chaines de caracteres je dois les garder en OleVariant, ce qui n'est pas vraiment genant, sauf que je fais des manipulations sur ces strings (un AnsiReplaceStr exactement). Or les functions de manipulations prennent en entree/sortie des AnsiString, voir des WideString pour certaines, mais pas des OleVariant.

    Bref, est ce que quelqu'un sait:
    - Pourquoi Delphi me vire les accents quand je stocke ma chaine de caractere OleVariant dans une WideString ?
    - (ou bien) Comment manipuler des chaines de caracteres OleVariant sans changer leur type ?

    Merci

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Decidement...encore un autre message pour plus de precisions:

    La conversion OleVariant->WideString ne pose AUCUN probleme, les accents sont toujours la.
    En fait c'est TRES trompeur car la watch list n'affiche pas les accents, donc en debug on peut pas savoir si ca marche ou pas...mais au final on a bien les accents qui s'affichent dans l'appli.
    (ce qui est tres bizarre, car si on laisse la variable en OleVariant, la watch list affiche bien les accents)

    Bref, maintenant tout va bien.
    Le seul truc, c7est que y'a pas mal de fonctions de manipulation (AnsiReplaceText, ...) qui n'existent pas pour les WideString. Je vais devoir coder ca a la main a partir des fonctions de manipulation de base. Un peu long, donc si quelqu'un connait une bonne Unit pour la manipulation des WideString, je suis preneur.

  6. #6
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    J'ai trouver quelques routines dans JclUnicode.pas ( de la JCL )...

    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
    function WideAdjustLineBreaks(const S: WideString): WideString;
    function WideCharPos(const S: WideString; const Ch: WideChar; const Index: Integer): Integer;  //az
    function WideCompose(const S: WideString): WideString;
    function WideDecompose(const S: WideString; Compatible: Boolean): WideString;
    function WideExtractQuotedStr(var Src: PWideChar; Quote: WideChar): WideString;
    function WideQuotedStr(const S: WideString; Quote: WideChar): WideString;
    function WideStringOfChar(C: WideChar; Count: Cardinal): WideString;
    function WideCaseFolding(C: WideChar): WideString; overload;
    function WideCaseFolding(const S: WideString): WideString; overload;
    function WideLowerCase(C: WideChar): WideString; overload;
    function WideLowerCase(const S: WideString): WideString; overload;
    function WideNormalize(const S: WideString; Form: TNormalizationForm): WideString;
    function WideSameText(const Str1, Str2: WideString): Boolean;
    function WideTitleCase(C: WideChar): WideString; overload;
    function WideTitleCase(const S: WideString): WideString; overload;
    function WideTrim(const S: WideString): WideString;
    function WideTrimLeft(const S: WideString): WideString;
    function WideTrimRight(const S: WideString): WideString;
    function WideUpperCase(C: WideChar): WideString; overload;
    function WideUpperCase(const S: WideString): WideString; overload;
    non exhaustif...

Discussions similaires

  1. Réponses: 11
    Dernier message: 02/10/2007, 11h11
  2. "String" constantes ou pas?
    Par Pragmateek dans le forum Langage
    Réponses: 5
    Dernier message: 11/06/2006, 18h24
  3. [I18N] internationalisation ne marche pas
    Par gloglo dans le forum Struts 1
    Réponses: 44
    Dernier message: 31/05/2006, 10h59
  4. Borland + sqlite (aducom) + string > 256 char = pas conte
    Par spyroux dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/12/2005, 22h48
  5. Réponses: 1
    Dernier message: 08/11/2005, 09h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo