représenter un string dans un string

tabliertablier Membre
15:07 modifié dans API AppKit #1
Y-a-t-il une méthode qui permet de passer d'un NSString à  un NSData ou les $0A ou $0D sont transcrits en \n ou \r, ou les " sont transcrits en \". Ou bien faut-il se le palucher soi même?
par exemple j'aimerais que la phrase:
Traduire "lune" par "moon"
Traduire "bouteilles" par "bottles".
devienne
"Traduire \"lune\" par \"moon\"\ntraduire \"bouteilles\" par \"bottles\"."

Réponses

  • AliGatorAliGator Membre, Modérateur
    15:07 modifié #2
    Et les "\" doivent être remplacés par "\\" aussi j'imagine ?
    Vu que tu listes exhaustivement dans ton post les caractères que tu veux convertir, le plus simple est de le faire soi-même y'en a pas beaucoup. Si c'est pour convertir dans un format spécifique officiel (format JSON ? Format de la RFC-machin ?) bah indique nous la norme à  respecter ;)

    NSString* str = ... /* chaine initiale */<br />str = [str stringByReplacingOccurrencesOfString:@&quot;&#092;&#092;&quot; withString:@&quot;&#092;&#092;&#092;&#092;&quot;]; // échappement des anti-slash<br />str = [str stringByReplacingOccurrencesOfString:@&quot;&#092;r&quot; withString:@&quot;&#092;&#092;r&quot;]; // échappement des $0A<br />str = [str stringByReplacingOccurrencesOfString:@&quot;&#092;n&quot; withString:@&quot;&#092;&#092;n&quot;]; // échappement des $0D<br />str = [str stringByReplacingOccurrencesOfString:@&quot;&#092;&quot;&quot; withString:@&quot;&#092;&#092;&#092;&quot;&quot;]; // échappement des guillemets
    


    Après j'ai pas compris ce que le NSData venait faire dans l'histoire et dans la question ?
  • tabliertablier Membre
    15:07 modifié #3
    Bon, c'est ce que j'ai fait jusqu'à  présent (et oui pour les \\). La destination du résultat est un NSMutableData qui sera sauvé dans un fichier. Donc, je n'utilise pas les méthodes de NSString, sauf characterAtIndex et je travaille dans un buffer C.
    if (((leString != nil) && (z=[leString length]) != 0)) // string vide ou absent?
    { for (x=0 ; x<z ; x++)
    { switch (kr = [leString characterAtIndex:x]) {
    case K_lf: lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'n' ; break ; // carriage return
    case K_cr:
    case K_ls:
    case K_ps: lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'r' ; break ; // line feed
    case '\\': lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'\\' ; break ; // backSlash
    case '\"': lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'\"' ; break ; // guillemets
    case '\'': lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'\'' ; break ; // apostrophe
    case '\t': lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'t' ; break ; // tabulation
    case '\b': lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'b' ; break ; // Backspace
    case '\f': lesCars[y++] = (unichar)'\\' ; lesCars[y++] = (unichar)'f' ; break ; // form feed
    case  0 : break ;
    default : lesCars[y++] = kr ; break ;
    } ;
    if (y >= 230)
    { y = y*sizeof(unichar) ;
    [letexte appendBytes:(const void *)lesCars length:y] ; // vider le buffer plein
    y = 0 ;
    } ;
    } ;
    } ;
    avec les définitions suivantes
    #define K_cr 13
    // line feed
    #define K_lf 10
    // line separator
    #define K_ls 8232
    // Paragraph separator
    #define K_ps 8233
    ça te parait correct?
  • AliGatorAliGator Membre, Modérateur
    15:07 modifié #4
    Heu vite fait à  première vue oui, mais pourquoi ne pas utiliser les possibilités de NSString pour avoir un code plus facile à  lire ? Tu as besoin de performances au point de passer à  du C ?
  • AliGatorAliGator Membre, Modérateur
    janvier 2011 modifié #5
    Je viens d'ouvrir le code de SBJSON (me disant qu'il devait certainement avoir besoin de faire un truc du genre) et voilà  leur code :
    NSUInteger length = [fragment length];<br />for (NSUInteger i = 0; i &lt; length; i++) {<br />	unichar uc = [fragment characterAtIndex:i];<br />	switch (uc) {<br />		case &#39;&quot;&#39;:&nbsp;  [json appendString:@&quot;&#092;&#092;&#092;&quot;&quot;];&nbsp; &nbsp; &nbsp;  break;<br />		case &#39;&#092;&#092;&#39;:&nbsp; [json appendString:@&quot;&#092;&#092;&#092;&#092;&quot;];&nbsp; &nbsp; &nbsp;  break;<br />		case &#39;&#092;t&#39;:&nbsp; [json appendString:@&quot;&#092;&#092;t&quot;];&nbsp; &nbsp; &nbsp; &nbsp; break;<br />		case &#39;&#092;n&#39;:&nbsp; [json appendString:@&quot;&#092;&#092;n&quot;];&nbsp; &nbsp; &nbsp; &nbsp; break;<br />		case &#39;&#092;r&#39;:&nbsp; [json appendString:@&quot;&#092;&#092;r&quot;];&nbsp; &nbsp; &nbsp; &nbsp; break;<br />		case &#39;&#092;b&#39;:&nbsp; [json appendString:@&quot;&#092;&#092;b&quot;];&nbsp; &nbsp; &nbsp; &nbsp; break;<br />		case &#39;&#092;f&#39;:&nbsp; [json appendString:@&quot;&#092;&#092;f&quot;];&nbsp; &nbsp; &nbsp; &nbsp; break;<br />		default:&nbsp; &nbsp; <br />			if (uc &lt; 0x20) {<br />				[json appendFormat:@&quot;&#092;&#092;u%04x&quot;, uc];<br />			} else {<br />				CFStringAppendCharacters((CFMutableStringRef)json, &amp;uc, 1);<br />			}<br />			break;<br />	}<br />}<br />
    
  • tabliertablier Membre
    15:07 modifié #6
    C'est peu différent, mais je vais quand même ajouter le traitement des caractères < $20.
    Tu as besoin de performances au point de passer à  du C ?
    Pas forcément. Dans mon modèle d'essais, la méthode est utilisée 2 fois par ligne, avec une moyenne de 20 à  40 lignes par fichier et ceci dans 200 fichiers avec deux passages par fichier. Soit 2*30*200*2 passages par cette méthode = 24000 passages. Donc en C c'est pas plus mal!  L'autre raison est que j'ai fait pas mal de C, plus que d'Obj-C.
    Je ne connais pas JSON, je vais aller voir cela!
  • AliGatorAliGator Membre, Modérateur
    15:07 modifié #7
    Bah en fait si je parle de JSON c'est que ma question : pourquoi as-tu besoin de faire ça ? Pour quel usage ? Usage interne, ou pour passage de paramètres à  un autre outil, ou quoi ?
    Là  j'ai pris l'exemple du standard JSON car je sais qu'il a ce genre de choses à  faire entre autres pour convertir une chaà®ne JSON en object Cocoa et vice-versa... Mais j'imagine que toi c'est pour tout autre chose, et si on avait le contexte d'utilisation on pourrait peut-être partir sur une norme toute faite ou une méthode proposant déjà  ce genre de choses ? C'est pour passer à  de l'AppleScript, à  un NSTask, c'est un format propriétaire, c'est pour envoyer à  un WebService ?
  • tabliertablier Membre
    15:07 modifié #8
    En fait, c'est pour traiter les fichiers créés par ibtool qui, lors de l'extraction des phrases à  traduire (par exemple), crée soit des .strings, soit des .plist. Donc c'est un usage interne à  mon logiciel Localise. Grosso modo, il faut mettre sur une seule ligne des strings pouvant comporter n'importe quel caractère.
    "27.title" = "ceci est un
    retour à  la ligne"
    ;
    "28.title" = "ceci est un\nretour à  la ligne" ; /* je préfère cette forme */

  • AliGatorAliGator Membre, Modérateur
    15:07 modifié #9
    Ah c'est marrant moi au contraire je préfère mettre le retour à  la ligne en vrai dans le fichier.

    Et tu peux pas lire le fichier strings (avec NSPropertyListSerialization) pour en extraire les chaà®nes plutôt que le parser toi-même ?
  • tabliertablier Membre
    15:07 modifié #10
    Ben, comme tu le sais j'ai appris Obj-C sur le tas car je ne suis pas informaticien. A l'époque de la première version, je ne connaissais pas
    NSPropertyListSerialization
    A l'heure actuelle j'essaie de reprendre ma programmation pour l'améliorer, d'ou ma question initiale.
  • tabliertablier Membre
    15:07 modifié #11
    Je viens d'aller voir NSPropertyListSerialization. Je ne sais comment utiliser cela!
    Mon but: Après avoir extrait (sous forme .plist) la hiérarchie, la liste des objets et la liste des strings localisables, il me faut analyser les trois "property list" pour créer un fichier traduisible et qui donne la hiérarchie d'objet du nib ou xib analysé.
    Un exemple est joint, mais si tu as téléchargé ma dernière version àŸ, tu peux extraire en mode hiérarchique les textes de n'importe quel xib ou nib.
Connectez-vous ou Inscrivez-vous pour répondre.