caractère accentué

tabliertablier Membre
09:28 modifié dans API AppKit #1
J'ai l'impression de patauger. j'appelle une méthode avec l'argument: @Maurice André.
Que je code cela en Mac Os roman, UTF8 ou UTF16, le compilateur me renvoie l'erreur:
  warning: non-ASCII character in CFString literal
Bien sur, c'est le "é" qui me fait Ch....  Comment doit-on écrire cela ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    09:28 modifié #2
    Il ne faut pas modifier l'encodage des fichiers .m, .h et .cpp, mais laisser en MacRoman car c'est ce qu'attend le compilateur.

    Si tu veux passer du texte accentué, le mieux qu'il y ait à  faire, c'est de passer par un fichier strings

    Tu crées un fichier Localizable.strings et tu mets par exemple :
    /* Ma chaine */<br />&quot;Nom&quot; = &quot;Maurice André&quot;
    
    Et tu sauves ton fichier en UTF8.
    Et ensuite dans ton code tu mets NSLocalizedString(@Nom,nil) là  où tu veux ton texte.

    Voilà   <3
  • tabliertablier Membre
    09:28 modifié #3
    Je suis passé par un fichiers xx.strings. ça marche bien sur!
    Ma question était relative à  des noms propres qui ne sont jamais traduits! Dans ce cas le passage par un "NSLocalizedStringFromTable" parait inutile, mais je ne trouve pas la manière de m'en passer!
  • Eddy58Eddy58 Membre
    09:28 modifié #4
    Comme ça ? :)
    [tt]
    NSMutableString *nom=[NSMutableString stringWithString:@Maurice Andr];
    [nom appendString:[NSString stringWithUTF8String:"é\n"]];
    [/tt]
  • ChachaChacha Membre
    09:28 modifié #5
    dans 1141686351:

    NSMutableString *nom=[NSMutableString stringWithString:@Maurice Andr];
    [nom appendString:[NSString stringWithUTF8String:"é\n"]];


    Si ça marchait, il suffirait d'écrire
    NSMutableString *nom=[NSMutableString stringWithUTF8String:@Maurice André];

    Non, le truc c'est que le code source ne doit pas être en UTF8. Enfin, ça me semble à  déconseiller.
    +
    Chacha
  • 09:28 modifié #6
    Si le code est est en MacOSRoman, il suffit d'initialiser une Cstring en précisant qu'on a du MacOSRoman non?


    [NSString stringWithCString:"Maurice André" encoding:NSMacOSRomanStringEncoding]

    Mais ça ne m'empêche pas de penser que mettre des données en brut dans le code n'est pas spécialement le plus adéquat. Il serait plus intelligent à  mon sens de placer un plist dans les Resources de l'app. Tu devrais aussi pouvoir mettre un .strings directement dans Resources en fait.
  • AliGatorAliGator Membre, Modérateur
    09:28 modifié #7
    Oui et c'est aussi pour ça que je t'ai conseillé de le mettre dans un fichier externe.

    Et puis les fichiers xx.strings ne sont pas obligatoirement localisés, il me semble avoir vu des fichiers strings hors de dossiers .lproj, non ?
    Du moment qu'on précise quel fichier xx.strings on veut ;)
  • 09:28 modifié #8
    Le système de chargement des resources de os x va d'abord chercher dans les dossiers .lproj et s'il ne trouve rien il va dans Resources. Le fait que ce soit un .strings n'est pas déterminant dans ce mécanisme.
  • Eddy58Eddy58 Membre
    mars 2006 modifié #9
    dans 1141691873:

    dans 1141686351:

    NSMutableString *nom=[NSMutableString stringWithString:@Maurice Andr];
    [nom appendString:[NSString stringWithUTF8String:"é\n"]];


    Si ça marchait, il suffirait d'écrire
    NSMutableString *nom=[NSMutableString stringWithUTF8String:@Maurice André];

    Ce code fonctionne, j'avais fais des tests, et en une seule ligne comme tu fais, j'avais toujours le warning, tandis que le appendString fait bizarrement sauter ce warning. ??? Le "é" s'affiche correctement dans le log.
    Le code de Renaud est lui sans warning, mais le "é" est remplacé par d'autres caractères dans le log.
    Mais bon, il est vrai qu'il est plus "propre" de mettre ce genre de données dans un fichier dédié.
  • ChachaChacha Membre
    09:28 modifié #10
    dans 1141746964:

    dans 1141691873:

    dans 1141686351:

    NSMutableString *nom=[NSMutableString stringWithString:@Maurice Andr];
    [nom appendString:[NSString stringWithUTF8String:"é\n"]];


    Si ça marchait, il suffirait d'écrire
    NSMutableString *nom=[NSMutableString stringWithUTF8String:@Maurice André];

    Ce code fonctionne, j'avais fais des tests, et en une seule ligne comme tu fais, j'avais toujours le warning, tandis que le appendString fait bizarrement sauter ce warning. ??? Le "é" s'affiche correctement au log.


    J'avais pas testé, c'est vrai, mais j'ai compris, en relisant.
    Il y a une différence énooorme entre
        [NSString stringWithUTF8String:"é\n"]
    et
        [NSString stringWithUTF8String:@é\n]

    ça vient de là , j'avais pas vu.

    +
    Chacha
  • Eddy58Eddy58 Membre
    09:28 modifié #11
    Ha ben oui voilà , ça va mieux ainsi. :P :p :p
  • AliGatorAliGator Membre, Modérateur
    09:28 modifié #12
    Bien vu Chacha...

    Mais finalement il vaut mieux faire avec CString que UTF8String si on ne met pas de @, non ?
    Et du coup pourquoi le code de Renaud (initWithCString:encoding:) ne fonctionne-t-il pas ?
  • 09:28 modifié #13
    [NSString stringWithFormat:@%C,233]; au moins pas de problème d'encodage avec le source...
  • Eddy58Eddy58 Membre
    09:28 modifié #14
    dans 1141747452:

    Et du coup pourquoi le code de Renaud (initWithCString:encoding:) ne fonctionne-t-il pas ?

    [tt]
    [NSString stringWithCString:"Maurice André" encoding:NSMacOSRomanStringEncoding][/tt]
    donne[tt]
    Maurice Andr?©
    [/tt][tt]
    [NSString stringWithCString:"Maurice André" encoding:NSUTF8StringEncoding][/tt]
    donne[tt]
    Maurice André
    [/tt]
  • 09:28 modifié #15
    Mon code marche très bien. Vérifiez que votre fichier est bien en Roman. (Les fichiers sources ajoutés par Xcode sont en UTF8, mais le compilo attend du Roman, d'où confusion).
  • Eddy58Eddy58 Membre
    09:28 modifié #16
    Ha oui en effet, c'est vrai qu'il faut veiller à  ça aussi. :)
  • tabliertablier Membre
    09:28 modifié #17
    Vu le nombre de réponses, je vois que c'est un sujet pas très évident.
    Je souhaite faire remarquer que dans les préférences, dans le panneau "editing", il y a possibilité de changer le codage par défaut des fichiers sources, et que l'on peut également changer individuellement le codage d'un fichier dans son paneau d'information.
    Je pense donc que le compilateur est capable de s'adapter au codage des fichiers sources.
    La question est différente pour les fichiers qui sont copiés dans les ressources sans être lus.

    Merci de vos réponses.
Connectez-vous ou Inscrivez-vous pour répondre.