[Résolu] Passage sous lion / xcode 4.5 : mes accents sont pétés...

NaoNao Membre
janvier 2013 modifié dans API UIKit #1
Bonjour à  tous,



Je viens de mettre à  jour mon poste avec lion et xcode 4.5.2 (oui je sais il était temps...) et j'ai le comportement suivant :



J'affiche un libellé provenant d'un web service, par exemple : "Pyrénées".



Lorsque j'utilise xcode 4.2, j'obtiens les infos suivantes :

trace du WS : "Pyrénées" / trace description de l'objet : "Pyr\\U00e9n\\U00e9es" / Affichage du libellé dans l'écran : "Pyrénées"





Lorsque j'utilise xcode 4.5.2, j'obtiens les infos suivantes :

trace du WS : "Pyrénées" / trace description de l'objet : "Pyr233n233es" / Affichage du libellé dans l'écran : "Pyr233n233es"



Pourquoi tant de haine ?



Une idée ?

Merci.

Réponses

  • J'ai le même problème (exactement le même) lors de la récupération d'information d'une base de données mySql (charset Latin1) et l'affichage d'un libellé avec un NSString (UTF8) et impossible de récupérer les accents ...



    Je suppose donc que cela viens du formatage de tes chaà®ne de caractères qui ne sont plus en adéquation avec la version de xCode.

    Si c'est ça la résolution m'intéresse.
  • LeChatNoirLeChatNoir Membre, Modérateur
    Pb d'encodage manifestement.



    Ca ressemble à  de l'UTF8 dans le premier cas... A rien dans le second....



    Es tu sûr que ton code n'a pas changé côté client ?
  • AliGatorAliGator Membre, Modérateur
    Si cela venait d'une mise à  jour, c'est pas de Xcode (le logiciel) à  proprement parler, c'est plutôt du SDK, puisqu'en mettant à  jour Xcode tu as certainement mis à  jour également le SDK utilisé. Or sans doute que l'ancien SDK était très laxiste et permissif, et que le nouveau SDK respecte mieux les standards concernants les encodages.



    Je confirme que dans ton 2e cas ça reste bizarre ta trace de description de l'objet... C'est quoi le bout de code qui te fait passer de l'un à  l'autre au juste ? Pour passer du é à  ta description que tu affiches ?



    Et puis ton WS est bizarre, il te retourne des caractères avec un échappement HTML des entités ("&xxx;"), alors qu'on se demande ce que ça fout là  et qu'il devrait te retourner soit de l'UTF8 directement, soit éventuellement un autre charset (genre ISO-Latin-1), soit l'échappement unicode officiel du caractère ("\u00e9"). Pas un HTMLEntity, qui n'a de sens qu'en HTML pur et sera interprété par un navigateur web pour l'affichage, mais n'a pas de sens dans une réponse de WebService.
  • NaoNao Membre
    janvier 2013 modifié #5
    C'est bon c'est réglé.



    Le code qui transformait "é" en "é" était :


    <br />
    unsigned charCode;<br />
    if ([scanner scanInt:(int*)&amp;charCode]) {<br />
      [result appendFormat:@&quot;%u&quot;, charCode];<br />
    }<br />
    




    Que j'ai remplacé par :
    <br />
    unsigned charCode;<br />
    if ([scanner scanInt:(int*)&amp;charCode]) {<br />
       unichar c = (unichar) charCode;<br />
       [result appendFormat:@&quot;%@&quot;, [NSString stringWithCharacters:&amp;c length:1]];<br />
    }<br />
    








    Merci à  tous.
  • AliGatorAliGator Membre, Modérateur
    Ahhhh ok parce que c'était toi qui avait écrit du code pour transformer le &#xxx; en un caractère, j'avais pas compris ça du tout moi !



    Et en effet pour ton cas je comprend pas comment ton code marchait avant, puisque "%u" c'est pour afficher des unsigned int, pas des caractères... donc c'est normal que ça te faisait ça ! (mais pas normal ni logique que ça marchait avec ton ancienne version de Xcode et du SDK par contre)
  • Voici le code complet :


    <br />
    - (NSString *)stringByDecodingXMLEntities {<br />
        NSUInteger myLength = [self length];<br />
        NSUInteger ampIndex = [self rangeOfString:@&quot;&amp;&quot; options:NSLiteralSearch].location;<br />
        // Short-circuit if there are no ampersands.<br />
        if (ampIndex == NSNotFound) {<br />
    	    return self;<br />
        }<br />
        // Make result string with some extra capacity.<br />
        NSMutableString *result = [NSMutableString stringWithCapacity:(myLength * 1.25)];<br />
        // First iteration doesn&#39;t need to scan to &amp; since we did that already, but for code simplicity&#39;s sake we&#39;ll do it again with the scanner.<br />
        NSScanner *scanner = [NSScanner scannerWithString:self];<br />
        do {<br />
    	    // Scan up to the next entity or the end of the string.<br />
    	    NSString *nonEntityString;<br />
    	    if ([scanner scanUpToString:@&quot;&amp;&quot; intoString:&amp;nonEntityString]) {<br />
    		    [result appendString:nonEntityString];<br />
    	    }<br />
    	    if ([scanner isAtEnd]) {<br />
    		    goto finish;<br />
    	    }<br />
    	    // Scan either a HTML or numeric character entity reference.<br />
    	    if ([scanner scanString:@&quot;&amp;amp;&quot; intoString:NULL])<br />
    		    [result appendString:@&quot;&amp;&quot;];<br />
    	    else if ([scanner scanString:@&quot;&amp;apos;&quot; intoString:NULL])<br />
    		    [result appendString:@&quot;&#39;&quot;];<br />
    	    else if ([scanner scanString:@&quot;&amp;quot;&quot; intoString:NULL])<br />
    		    [result appendString:@&quot;\&quot;&quot;];<br />
    	    else if ([scanner scanString:@&quot;&amp;lt;&quot; intoString:NULL])<br />
    		    [result appendString:@&quot;&lt;&quot;];<br />
    	    else if ([scanner scanString:@&quot;&amp;gt;&quot; intoString:NULL])<br />
    		    [result appendString:@&quot;&gt;&quot;];<br />
    	    else if ([scanner scanString:@&quot;&amp;#&quot; intoString:NULL]) {<br />
    		    BOOL gotNumber;<br />
    		    unsigned charCode;<br />
    		    NSString *xForHex = @&quot;&quot;;<br />
    		    // Is it hex or decimal?<br />
    		    if ([scanner scanString:@&quot;x&quot; intoString:&amp;xForHex]) {<br />
    			    gotNumber = [scanner scanHexInt:&amp;charCode];<br />
    		    }<br />
    		    else {<br />
    			    gotNumber = [scanner scanInt:(int*)&amp;charCode];<br />
    		    }<br />
    		    if (gotNumber) {<br />
    			    [result appendFormat:@&quot;%C&quot;, charCode];<br />
    		    }<br />
    		    else {<br />
    			    NSString *unknownEntity = @&quot;&quot;;<br />
    			    [scanner scanUpToString:@&quot;;&quot; intoString:&amp;unknownEntity];<br />
    			    [result appendFormat:@&quot;&amp;#%@%@;&quot;, xForHex, unknownEntity];<br />
    			    NSLog(@&quot;Expected numeric character entity but got &amp;#%@%@;&quot;, xForHex, unknownEntity);<br />
    		    }<br />
    		    [scanner scanString:@&quot;;&quot; intoString:NULL];<br />
    	    }<br />
    	    else {<br />
    		    NSString *unknownEntity = @&quot;&quot;;<br />
    		    [scanner scanUpToString:@&quot;;&quot; intoString:&amp;unknownEntity];<br />
    		    NSString *semicolon = @&quot;&quot;;<br />
    		    [scanner scanString:@&quot;;&quot; intoString:&amp;semicolon];<br />
    		    [result appendFormat:@&quot;%@%@&quot;, unknownEntity, semicolon];<br />
    		    NSLog(@&quot;Unsupported XML character entity %@%@&quot;, unknownEntity, semicolon);<br />
    	    }<br />
        }<br />
        while (&#33;[scanner isAtEnd]);<br />
    finish:<br />
        return result;<br />
    }<br />
    




    et le lien :



    http://stackoverflow.com/questions/1105169/html-character-decoding-in-objective-c-cocoa-touch



    image/wink.png' class='bbc_emoticon' alt=';)' />
Connectez-vous ou Inscrivez-vous pour répondre.