modifier l'encodage des NSString d'un tableau ou un dico

chaps31chaps31 Membre
22:58 modifié dans API AppKit #1
Encore moi, bavard ce soir,
Je m'arrache les cheveux sur un problème. J'ai une base de donnée postgresql ou les champs textes sont en UTF8, pour rentrer le valeurs sans problème, juste avant l'exécution de la requête je la passe à  la moulinette de :
NSString *strUpd=[NSString stringWithCString:[updPG UTF8String] encoding:NSMacOSRomanStringEncoding];

mais lorsque je les rapatrie les accents sont remplacés par des signes... Problème d'encodage...
Je ne trouve nulle part (y compris dasn AppKiDO) comment modifier l'encodage des champs d'un tableau ou d'un dictionnaire, en sachant en plus que certains champs sont des integer...

Réponses

  • AliGatorAliGator Membre, Modérateur
    22:58 modifié #2
    Heu c'est quoi ce mélange de UTF8String et MacOSRoman ?
    Tu lui demandes d'interpréter des données UTF8 en MacOS (interpréter, pas convertir), donc forcément ce qui est renvoyé risque d'être un peu n'importe quoi, non ?
  • chaps31chaps31 Membre
    22:58 modifié #3
    Je faisais autrement au départ, c'est un copié-collé d'un bout de code conseillé,sans doute mal adapté, je vais revenir à  mon premier système en l'adaptant...
    Merci
  • schlumschlum Membre
    22:58 modifié #4
    dans 1256071277:

    Heu c'est quoi ce mélange de UTF8String et MacOSRoman ?
    Tu lui demandes d'interpréter des données UTF8 en MacOS (interpréter, pas convertir), donc forcément ce qui est renvoyé risque d'être un peu n'importe quoi, non ?


    Sauf si les données d'origine sont déjà  du MacOS Roman corrompu en UTF-8  :)
  • chaps31chaps31 Membre
    22:58 modifié #5
    Bon décidément je ne comprend pas grand chose aux encodages... Il se trouve que la méthode
    stringWithCString:
    
    est visiblement remplacé par
    stringWithCString:encoding:
    
    .
    Je ne comprend pas pourquoi la ligne vous semble si insensée... Je suis bien dans mon bac à  sable ;)

    Je reprend un ancien projet et revois son code, notamment pour l'accès à  une base de donnée, j'intègre un framework qui n'existait pas avant, ce qui, vous vous en doutez allège mon code... J'avais résolu le problème de l'encodage la dernière fois, et il faut recommencer...

    En effet pour une bonne gestion des accents il faut que j'encode le texte en UTF8 avant de rentrer dans la base, mais du coup lorsque je ressort les données j'imagine qu'il faut que je fasse un
    stringWithUTF8String
    
    , mes problèmes viennent peut-être du retour. Sauf que maintenant les données arrivent sous forme de dico que je mets dans un tableau et j'aimerais pouvoir modifier d'un coup tous les UTF8 du dico (ou du tableau) mais qui ne contient pas que des données en UTF8... Passer chaque valeur n'est pas très élégant...

    Ceci dit lorsque je regarde la base, les accents sont remplacés par des signes, je ne sais pas si c'est normal...

    Bref je fais de la brasse coulée...
  • chaps31chaps31 Membre
    22:58 modifié #6
    Ok c'est certains le problème ne vient pas de l'entrée dans la base mais de la sortie... Ctrle fait avec mon ancien code (gardé en svg..) Donc la ligne de code précédente fonctionne.
  • schlumschlum Membre
    22:58 modifié #7
    dans 1256127207:

    Ok c'est certains le problème ne vient pas de l'entrée dans la base mais de la sortie... Ctrle fait avec mon ancien code (gardé en svg..) Donc la ligne de code précédente fonctionne.


    Si je me souviens bien, cette ligne de code est un patch (sale) permettant de corriger un bug du framework qui sort des données soi-disant UTF-8 mais qui sont en fait MACOS ROMAN (un NSString corrompu en gros, et ça permet de corriger la corruption).
  • chaps31chaps31 Membre
    22:58 modifié #8
    Bigre... sale, corrompus, on se croirait en politique ;) C'est du copié-collé d'une aide poru utilise rle framework oui...

    Mon ancien code réinterprète l'UTF8 de la base et me sort les é è... très bien, é è rentrés avec mon nouveau code, donc dans la base c'est bon, il faut que je trouve un moyen élégant de passer correctement du UTF8 à  un NSString pour un dico ou un tableau. Je cherche et suis preneur de toute idée...
  • schlumschlum Membre
    22:58 modifié #9
    dans 1256140187:

    Bigre... sale, corrompus, on se croirait en politique ;) C'est du copié-collé d'une aide poru utilise rle framework oui...

    Mon ancien code réinterprète l'UTF8 de la base et me sort les é è... très bien, é è rentrés avec mon nouveau code, donc dans la base c'est bon, il faut que je trouve un moyen élégant de passer correctement du UTF8 à  un NSString pour un dico ou un tableau. Je cherche et suis preneur de toute idée...


    Un NSString se suffit à  lui même ; quand il est utilisé, c'est avec son encodage interne.
    Le seul problème, c'est qu'apparemment ce que tu reçois n'est pas de l'UTF-8.

    Donc fais afficher "updPG" (une chaà®ne avec un "é" par exemple), et montre ce que ça donne.
  • chaps31chaps31 Membre
    22:58 modifié #10
    j'ai mis un breakpoint et regardé la variable, le "é" ressort comme cela dans le log : "\U221a\U00a9"

    C'est quoi ça  :)beta:
  • schlumschlum Membre
    octobre 2009 modifié #11
    dans 1256212671:

    j'ai mis un breakpoint et regardé la variable, le "é" ressort comme cela dans le log : "\U221a\U00a9"

    C'est quoi ça  :)beta:


    C'est "é" qui a été codé en UTF-16
    "é" étant lui même la représentation MAC OS ROMAN du codage UTF-8 pour "é"
  • RocouRocou Membre
    22:58 modifié #12
    dans 1256127629:

    Si je me souviens bien, cette ligne de code est un patch (sale) permettant de corriger un bug du framework qui sort des données soi-disant UTF-8 mais qui sont en fait MACOS ROMAN (un NSString corrompu en gros, et ça permet de corriger la corruption).

    Non, il ne s'agit pas de cela. Mais c'est effectivement toi qui m'avait aidé à  contourner ce bug  ;)
    Ce dernier a été corrigé.

    Quant aux implementations dont parle chaps31, elles sont issues de mon code (une fois de plus avec l'aide des membres du forum)
    @implementation NSString (MacOSRomanToUTF8Converting)<br />- (NSString *)reinterpretAsUTF8 {<br />&nbsp; &nbsp; return [NSString stringWithUTF8String:[self cStringUsingEncoding:NSMacOSRomanStringEncoding]];<br />}<br /><br />@end<br /><br />@implementation NSString (UTF8toMacOSRomanConverting)<br />- (NSString *)reinterpretAsMacOSRoman {<br />&nbsp; &nbsp; return [NSString stringWithUTF8String:[self cStringUsingEncoding:NSUTF8StringEncoding]];<br />}<br />
    


    Elles servent à  convertir l'UTF-8 de la base en MacRoman et vice versa.
    Evidemment, si chaps31 à  initialisé sa base en UTF-16, il faut revoir ce code.

    Il y a certainement une manière plus élégante de réaliser cela mais bon ça fonctionne très bien comme ça.
  • schlumschlum Membre
    22:58 modifié #13
    Ah non, ces lignes ne font pas de la conversion mais de la réinterprétation d'encodage. C'est totalement différent...  ;)

    La conversion, c'est quand on a une chaà®ne correcte dans un encodage A et qu'on la passe en une chaà®ne correcte dans un encodage B
    La réinterprétation c'est quand on a une chaà®ne incorrecte (représentation par un encodage B d'un encodage A)
  • chaps31chaps31 Membre
    22:58 modifié #14
    Bon, ça marche, mais je ne comprends pas tout ce que je fais... Surtout je trouve ça un peu lent au premier lancement, une critique sur mon code ?
    - (NSString *)reinterpretAsUTF8:(NSString *) theString<br />{<br />&nbsp; &nbsp; return [NSString stringWithUTF8String:[theString cStringUsingEncoding:NSMacOSRomanStringEncoding]];<br />}<br /><br />- (NSString *)reinterpretAsMacOSRoman:(NSString *) theString<br />{<br />&nbsp; &nbsp; return [NSString stringWithUTF8String:[theString cStringUsingEncoding:NSUTF8StringEncoding]];<br />}<br /><br />/********************************/<br /><br />-(NSMutableArray *)createTabComplete:(NSString *) table:(NSString *) orderby<br />{<br />	NSString *strSelect=[[NSString alloc] initWithFormat:@&quot;SELECT * FROM %@ %@&quot;,table,orderby];<br />	PGSQLRecordset *rs = [connection open:strSelect];<br />	[strSelect release];<br />	if (rs==nil &amp;&amp; [table isEqualTo:@&quot;utilisateurs&quot;]) <br />		{ <br />			[AlertMes shutdown:@&quot;Erreur&quot; :@&quot;Table utilisateur vide - Gestovet doit quitter.&quot;];<br />		}<br />	NSMutableArray *tabRetour=[[NSMutableArray alloc]init];	//TableauSource en retour<br />	while (![rs isEOF])<br />		{<br />			NSMutableDictionary *dicoForTab=[[NSMutableDictionary alloc] initWithDictionary:[[rs dictionaryFromRecord]mutableCopy]];<br />			NSEnumerator *enumKeys=[[[rs dictionaryFromRecord]mutableCopy] keyEnumerator]; <br />			<br />			id identifier; <br />			while ( (identifier = [enumKeys nextObject]) )&nbsp; <br />				{<br />					[dicoForTab setValue:[NSMutableString stringWithString:[self reinterpretAsUTF8:[dicoForTab valueForKey:identifier]]] forKey:identifier];<br />				}<br />			[tabRetour addObject:dicoForTab];<br />			[rs moveNext];<br />		}<br />	return tabRetour;<br />}
    


    PS : je sais il faut que je mette des release
Connectez-vous ou Inscrivez-vous pour répondre.