NSString à  l'envers

2

Réponses

  • schlumschlum Membre
    décembre 2007 modifié #32
    Si si, je tiens compte des décompositions, puisque je demande expressément à  NSString de mettre sous forme pré-composée canonique à  la première ligne  :)

    NSString *str2 = [str precomposedStringWithCanonicalMapping];
    


    Je ne vois pas ce que tu entends par "caractères qui ne peuvent pas être précomposés" ; s'ils ne peuvent être précomposés, ils ne peuvent être présentés sous forme d'un seul glyphe, si ?

    Sans vouloir être pompeux, j'ai fait pas mal de tests cette nuit, et je pense que mes deux bouts de codes de la fin de la page précédentent gèrent tous les cas d'inversion de glyphes    <3 <br />

    Maintenant, faut voir ce que ça donne avec les trucs qui s'écrivent de droite à  gauche, c'est sûr, et traiter le cas ; mais ils ne sont pas considérés comme glyphes...  :o
    C'est sûr qu'il y a des cas où "inverser" ne veut rien dire (en Arabe par exemple...)
  • schlumschlum Membre
    07:52 modifié #33
    *** erreur Citer / Modifier ***
  • psychoh13psychoh13 Mothership Developer Membre
    décembre 2007 modifié #34
    dans 1197543888:
    faut-il utiliser la représentation interne (utilisée par Apple)


    Je tiens à  contester ceci... On ne sait absolument rien de la représentation interne utilisée par Apple, -length et -characterAtIndex: sont des méthodes primitives permettant à  toutes les méthodes définies dans l'interface NSString de fonctionner normalement avec n'importe laquelle de ses sous-classes.
    Mais absolument rien n'empêche Apple ou tout autre implémentateur de redéfinir les méthodes secondaires dans les sous-classes pour les adapter à  leurs sous-classes, d'ailleurs Apple le conseille pour certaines méthodes.
    Donc rien n'empêche Apple, par exemple, d'utiliser un tableau de valeurs sur 32 bits et de compter les cases dont les 16 bits de poids fort sont à  zéro comme un seul unichar et les autres comme étant 2 unichar.
    Tu peux même te faire une structure à  la con contenant 2 unichar et retourner le nombre d'unichars "significatifs".

    Les seuls recommandations d'Apple sur l'implémentation, c'est que la NSString ne stocke qu'un groupe de caractères et leur nombre. C'est-à -dire que dans une sous-classe de NSString tu ne vas pas indiquer la couleur du texte ou la police par exemple, mais à  part ça tu fais ce que tu veux pour stocker ta chaà®ne de caractères.
  • schlumschlum Membre
    07:52 modifié #35
    C'est une supposition, compte tenu des contraintes d'optimisation de NSString.
    Je les vois mal utiliser une représentation interne en UTF-8 et sortir de l'UTF-16 quand on demande "getCharacters"  ;)
  • psychoh13psychoh13 Mothership Developer Membre
    07:52 modifié #36
    Bah ça t'en sais rien du tout :P C'est peut-être plus intéressant de faire comme ça pour eux. :P  :o
  • schlumschlum Membre
    décembre 2007 modifié #37
    L'idée m'est venue d'aller voir la référence de CFString ; ben elle est plus aboutie que la doc de NSString  :o

    CFString has two primitive functions, CFStringGetLength and CFStringGetCharacterAtIndex, that provide the basis for all other functions in its interface. The CFStringGetLength function returns the total number (in terms of UTF-16 code pairs) of characters in the string. The CFStringGetCharacterAtIndex function gives access to each character in the string by index, with index values starting at 0.


    Par ailleurs, cette fonction est très intéressante : "CFStringGetCharactersPtr"

    Return Value
    A pointer to a buffer of Unicode character, or NULL if the internal storage of theString does not allow this to be returned efficiently.

    Discussion
    This function either returns the requested pointer immediately, with no memory allocations and no copying, or it returns NULL. If the latter is the result, call an alternative function such as CFStringGetCharacters function to extract the characters.

    Whether or not this function returns a valid pointer or NULL depends on many factors, all of which depend on how the string was created and its properties. In addition, the function result might change between different releases and on different platforms. So do not count on receiving a non-NULL result from this function under any circumstances (except when the object is created with CFStringCreateMutableWithExternalCharactersNoCopy).


    Si ça ne cause aucune allocation mémoire, mais que ça peut poser problème avec des "NoCopy", c'est que c'est forcément la représentation interne de CFString (et donc de NSString)  ;)


    [Edit] Je pourrais améliorer ma fonction d'inversion du coup avec ça, mais pas le courage (et dangereux pour les "NoCopy") :)
  • psychoh13psychoh13 Mothership Developer Membre
    07:52 modifié #38
    Il dit pas que ça pose un problème avec des NoCopy.
    Il dit que si la chaà®ne de caractères a été créé à  partir de CFStringCreateMutableWithExternalCharactersNoCopy() tu es sûr que la fonction CFStringGetCharactersPtr() retournera un pointeur non-NULL et à  fortiori il s'agira du pointeur qui a été passé à  la première fonction.
    Mais tu as différente représentation interne, tu as la représentation sous forme de C-String et aussi sous forme de Pascal-String... :D
  • schlumschlum Membre
    décembre 2007 modifié #39
    dans 1197549315:

    Il dit pas que ça pose un problème avec des NoCopy.
    Il dit que si la chaà®ne de caractères a été créé à  partir de CFStringCreateMutableWithExternalCharactersNoCopy() tu es sûr que la fonction CFStringGetCharactersPtr() retournera un pointeur non-NULL et à  fortiori il s'agira du pointeur qui a été passé à  la première fonction.


    Non, c'est moi qui suppose que ça pose problème avec des "noCopy" ; il y a une fonction "CFStringCreateWithBytesNoCopy" ; c'est une représentation externe, donc c'est sûr que là  la représentation interne sera un pointeur opaque vers l'extérieur et un encodage ; sans copie, il ne passera pas le truc dans sa propre représentation interne UTF-16, et ne pourra répondre que "NULL" à  "CFStringGetCharactersPtr".

    Mais tu as différente représentation interne, tu as la représentation sous forme de C-String et aussi sous forme de Pascal-String... :D


    Tu pinailles là , je parle de la représentation interne classique, c'est à  dire justement quand "CFStringGetCharactersPtr" ne renvoie pas "NULL", ce qui est le cas la plupart du temps  ;)

    Sinon, je peux faire un test dans ma fonction ; si elle renvoie NULL -> "error : too complex" :)
    (enfin de toute façon, dans ma fonction il y a copie, et conversion si ce n'est pas en représentation classique...)

    Pour les cString, il y a NSSimpleCString  :P
  • psychoh13psychoh13 Mothership Developer Membre
    07:52 modifié #40
    Le truc c'est qu'en utilisant -stringWithString: il copie non seulement la chaà®ne de caractères mais aussi sa représentation. :D Donc à  priori il n'y a pas de représentation "classique". ;D
  • schlumschlum Membre
    07:52 modifié #41
    dans 1197550982:

    Le truc c'est qu'en utilisant -stringWithString: il copie non seulement la chaà®ne de caractères mais aussi sa représentation. :D Donc à  priori il n'y a pas de représentation "classique". ;D


    Ouais, j'ai enlevé l'histoire de "stringWithString" ; c'est surtout que ça ne sert à  rien, puisque j'utilise "getCharacters" de NSString et pas "CFStringGetCharactersPtr" de CFString

    Et à  priori "getCharacters" ne rate jamais  :) (donc il doit faire la conversion en cas de représentation "exotique" on va dire puisque t'aimes pas "classique").


    N'empêche que le fait que "CFStringGetCharactersPtr" n'alloue pas de mémoire prouve bien que "en général", il y a une représentation UTF-16 en interne, non ? :o
  • AliGatorAliGator Membre, Modérateur
    07:52 modifié #42
    dans 1197544513:

    Si si, je tiens compte des décompositions, puisque je demande expressément à  NSString de mettre sous forme pré-composée canonique à  la première ligne  :)

    NSString *str2 = [str precomposedStringWithCanonicalMapping];
    


    Je ne vois pas ce que tu entends par "caractères qui ne peuvent pas être précomposés" ; s'ils ne peuvent être précomposés, ils ne peuvent être présentés sous forme d'un seul glyphe, si ?
    Ben si justement.
    Il y a certains caractères qui sont déjà  existants sous leur forme précomposée dans la table des glyphes unicodes. C'est le cas par exemple de é è à  ê etc.
    Mais ce n'est pas le cas de tous. C'est expliqué par exemple dans la norme ici : regarde la figure 5, le caractère "d" qui a 2 diacritiques (un point au dessus et un point en dessous) n'a pas de forme précomposée se représentant sous la forme d'un unique caractère : la forme NFC nécessite quand même 2 caractères pour la représenter. Et du coup, si tu inverses l'ordre des caractères de ta chaà®ne ainsi, le non-caractère/signe diacritique se retrouvera de l'autre côté lors de ton inversion et sera appliqué au glyphe d'à  côté et non au "d" auquel il était appliqué à  l'origine.
    Et c'est encore pire pour le cas du "q" auquel on adjoint un ou deux points (au dessus/en dessous). Pour celui-là  il n'y a aucune forme précomposée existante.
    UAX15-NormFig5.jpg
    Donc [tt][str precomposedStringWithCanonicalMapping][/tt] ne fait que transformer les formes décomposées des caractères représentés dans la chaà®ne en leur version précomposée... pour les caractères pour lesquels cette forme est disponible !! Mais ce n'est pas le cas de tous les caractères. C'est d'ailleurs le but de la forme décomposée : à  l'origine l'idée d'Unicode c'est d'exprimer séparément le caractère de base et son ou ses signes diacritiques appliqués, pour pouvoir gérer toutes les possibilités. Mais après comme il y a beaucoup de caractères à  diacritiques qui sont souvent utilisés dans beaucoup de langues, comme le "é" ou le "à " en français, pour certains ils ont créé une forme précomposée... mais ils ne pouvaient pas prévoir tous les cas et toutes les formes précomposées non plus ;)
  • psychoh13psychoh13 Mothership Developer Membre
    07:52 modifié #43
    Non ;D Pas du tout ;D

    Si tu fais une chaà®ne de caractères à  partir d'un encodage spécifique ou à  partir de caractères ASCII < 127 ce qui est tout à  fait possible notamment en anglais, tu recevras un pointeur NULL.  ;D :o
  • schlumschlum Membre
    07:52 modifié #44
    dans 1197550982:

    Le truc c'est qu'en utilisant -stringWithString: il copie non seulement la chaà®ne de caractères mais aussi sa représentation. :D Donc à  priori il n'y a pas de représentation "classique". ;D


    Il ne semblerait pas  ;)

    CFStringRef str1 = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,&quot;ceci est une cString&quot;,kCFStringEncodingUTF8,kCFAllocatorDefault);<br />	NSLog(@&quot;%@&quot;,str1);<br />	NSLog(@&quot;0x%X&quot;,CFStringGetCharactersPtr(str1));<br />	NSString *str2 = [NSString stringWithString:(NSString*)str1];<br />	NSLog(@&quot;%@&quot;,str2);<br />	NSLog(@&quot;0x%X&quot;,CFStringGetCharactersPtr((CFStringRef)str2));
    


    2007-12-13 14:22:44.525 ReverseString[23933] ceci est une cString<br />2007-12-13 14:22:44.528 ReverseString[23933] 0x0<br />2007-12-13 14:22:44.529 ReverseString[23933] ceci est une cString<br />2007-12-13 14:22:44.529 ReverseString[23933] 0x304790
    


    Alors, quid d'une représentation "classique" ?  ;D
  • schlumschlum Membre
    décembre 2007 modifié #45
    dans 1197551917:

    Non ;D Pas du tout ;D

    Si tu fais une chaà®ne de caractères à  partir d'un encodage spécifique ou à  partir de caractères ASCII < 127 ce qui est tout à  fait possible notamment en anglais, tu recevras un pointeur NULL.  ;D :o


    ça il faudra me le prouver  ;)
    (Parce que mes tests démontrent le contraire :P)
  • schlumschlum Membre
    décembre 2007 modifié #46
    dans 1197551727:

    Donc [tt][str precomposedStringWithCanonicalMapping][/tt] ne fait que transformer les formes décomposées des caractères représentés dans la chaà®ne en leur version précomposée... pour les caractères pour lesquels cette forme est disponible !! Mais ce n'est pas le cas de tous les caractères. C'est d'ailleurs le but de la forme décomposée : à  l'origine l'idée d'Unicode c'est d'exprimer séparément le caractère de base et son ou ses signes diacritiques appliqués, pour pouvoir gérer toutes les possibilités. Mais après comme il y a beaucoup de caractères à  diacritiques qui sont souvent utilisés dans beaucoup de langues, comme le "é" ou le "à " en français, pour certains ils ont créé une forme précomposée... mais ils ne pouvaient pas prévoir tous les cas et toutes les formes précomposées non plus ;)


    OK, je commence à  comprendre et c'est fort intéressant !
    Mais dans ce cas, si il est représenté en forme précomposée sous la forme 0071 0323 0307, comment peut-on savoir au final si c'est le caractère q avec un point au-dessus et un point en-dessous, ou le caractère q suivi du caractère point en-dessous, suivi du caractère point au-dessus, ou même le caractère q avec un point en-dessous suivi du caractère point au-dessus ? (cas concret, comment un éditeur saura-t-il comment l'afficher !)
    ça reste LA zone d'ombre pour moi  ???
  • psychoh13psychoh13 Mothership Developer Membre
    07:52 modifié #47
    dans 1197552229:

    dans 1197550982:

    Le truc c'est qu'en utilisant -stringWithString: il copie non seulement la chaà®ne de caractères mais aussi sa représentation. :D Donc à  priori il n'y a pas de représentation "classique". ;D


    Il ne semblerait pas  ;)

    CFStringRef str1 = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,&quot;ceci est une cString&quot;,kCFStringEncodingUTF8,kCFAllocatorDefault);<br />	NSLog(@&quot;%@&quot;,str1);<br />	NSLog(@&quot;0x%X&quot;,CFStringGetCharactersPtr(str1));<br />	NSString *str2 = [NSString stringWithString:(NSString*)str1];<br />	NSLog(@&quot;%@&quot;,str2);<br />	NSLog(@&quot;0x%X&quot;,CFStringGetCharactersPtr((CFStringRef)str2));
    


    2007-12-13 14:22:44.525 ReverseString[23933] ceci est une cString<br />2007-12-13 14:22:44.528 ReverseString[23933] 0x0<br />2007-12-13 14:22:44.529 ReverseString[23933] ceci est une cString<br />2007-12-13 14:22:44.529 ReverseString[23933] 0x304790
    


    Alors, quid d'une représentation "classique" ?  ;D


    Bah disons que chez moi... Ton code me donne que des pointeurs NULL, alors soit c'est parce que je suis sous Leopard et toi sous Tiger et qu'ils ont largement modifier l'implémentation... Soit bah c'est bizarre. :D
  • schlumschlum Membre
    07:52 modifié #48
    OK, je vais essayer sous Leopard...
    ça m'étonne quand même qu'ils aient tout cassé la mécanique bien rôdée de CFString  ???

    Au fait, sous Tiger avec CFString, les encodages UTF-16 et UTF-32 que t'as donné au dessus existent déjà  :P
    Comme quoi, CoreFoundation a toujours une longueur d'avance sur Foundataion !
  • psychoh13psychoh13 Mothership Developer Membre
    07:52 modifié #49
    dans 1197552919:
    Comme quoi, CoreFoundation a toujours une longueur d'avance sur Foundataion !


    Normal, on dirait qu'Apple est réticent à  modifier trop rapidement les bases de Cocoa, alors que pour les outils dont il est et a toujours été propriétaire comme les Cores, ils semblent moins frileux. ;D

    Après tout, dans Core Graphics ont trouve des courbe de Bézier avec deux points de contrôle mais aussi un seul point alors que dans NSBezierPath il n'y a que celles avec 2 points de contrôle. :D
  • schlumschlum Membre
    07:52 modifié #50
    Je suis en tests sous Leopard, et tu as raison... "CFStringGetCharactersPtr" renvoie "NULL" dans la plupart des cas (même pour une string @";" ou "stringWithString") ; en fait, je n'ai pas trouvé de cas où il ne renvoyait pas "NULL".

    J'ai également testé la copie de représentation interne :
    char string&#91;] = &quot;ceci est une cString&quot;;<br />	CFStringRef str1 = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,string,kCFStringEncodingUTF8,kCFAllocatorDefault);<br />	NSString *str2 = [NSString stringWithString:(NSString*)str1];<br />	NSLog(@&quot;%@&quot;,str1);<br />	NSLog(@&quot;%@&quot;,str2);<br />	string[4] = &#39;&#092;0&#39;;<br />	NSLog(@&quot;%@&quot;,str1);<br />	NSLog(@&quot;%@&quot;,str2);
    


    Et le résultat est conforme à  tes attentes  ;)

    13/12/07 14:47:07 ReverseString[293] ceci est une cString<br /> 13/12/07 14:47:07 ReverseString[293] ceci est une cString<br /> 13/12/07 14:47:07 ReverseString[293] ceci<br /> 13/12/07 14:47:07 ReverseString[293] ceci
    


    Retour sous Tiger pour tester le même code, mais je connais déjà  le résultat, la représentation ne sera pas copiée à  priori...
  • schlumschlum Membre
    décembre 2007 modifié #51
    2007-12-13 14:57:43.074 ReverseString[349] ceci est une cString<br />2007-12-13 14:57:43.074 ReverseString[349] ceci est une cString<br />2007-12-13 14:57:43.074 ReverseString[349] ceci<br />2007-12-13 14:57:43.074 ReverseString[349] ceci est une cString
    


    Bingo...

    Donc apparemment, pour je ne sais quelle raison obscure, ils ont cassé avec Leopard leur représentation interne UTF-16 pour une représentation pointeur opaque + encoding

    ça a peut-être certains avantages, mais ça rend "getCharacters" beaucoup moins optimisé en tout cas.  ???
    (et au passage, ça détruit le code de tous ceux qui ont à  leurs risques et périls utilisé "CFStringGetCharactersPtr", qui fonctionnait quasiment tout le temps hors cas "NoCopy"  ;D)
  • schlumschlum Membre
    07:52 modifié #52
    dans 1197553328:

    Après tout, dans Core Graphics ont trouve des courbe de Bézier avec deux points de contrôle mais aussi un seul point alors que dans NSBezierPath il n'y a que celles avec 2 points de contrôle. :D


    Et surtout dans CoreGraphics on peut dessiner à  la fois le contour et l'intérieur, ce qu'on ne peut pas avec NSBezierPath... La loose  :P
    (enfin je dis ça... ça a peut-être changé dans Leopard)
  • psychoh13psychoh13 Mothership Developer Membre
    07:52 modifié #53
    dans 1197554640:

    dans 1197553328:

    Après tout, dans Core Graphics ont trouve des courbe de Bézier avec deux points de contrôle mais aussi un seul point alors que dans NSBezierPath il n'y a que celles avec 2 points de contrôle. :D


    Et surtout dans CoreGraphics on peut dessiner à  la fois le contour et l'intérieur, ce qu'on ne peut pas avec NSBezierPath... La loose  :P
    (enfin je dis ça... ça a peut-être changé dans Leopard)


    Non ça n'a pas changé :D Mais bon ce sont juste deux appels différents, au final c'est toujours la même chose. :D
  • schlumschlum Membre
    07:52 modifié #54
    dans 1197554738:

    dans 1197554640:

    dans 1197553328:

    Après tout, dans Core Graphics ont trouve des courbe de Bézier avec deux points de contrôle mais aussi un seul point alors que dans NSBezierPath il n'y a que celles avec 2 points de contrôle. :D


    Et surtout dans CoreGraphics on peut dessiner à  la fois le contour et l'intérieur, ce qu'on ne peut pas avec NSBezierPath... La loose  :P
    (enfin je dis ça... ça a peut-être changé dans Leopard)


    Non ça n'a pas changé :D Mais bon ce sont juste deux appels différents, au final c'est toujours la même chose. :D


    Ah ben non, on y perd vachement en performances quand même  ;) Il faut recalculer le contour deux fois avec Cocoa, et une seule fois avec CoreGraphics (enfin si leur truc est bien foutu bien sûr...) !
  • AliGatorAliGator Membre, Modérateur
    décembre 2007 modifié #55
    dans 1197552584:

    OK, je commence à  comprendre et c'est fort intéressant !
    Mais dans ce cas, si il est représenté en forme précomposée sous la forme 0071 0323 0307, comment peut-on savoir au final si c'est le caractère q avec un point au-dessus et un point en-dessous, ou le caractère q suivi du caractère point en-dessous, suivi du caractère point au-dessus, ou même le caractère q avec un point en-dessous suivi du caractère point au-dessus ? (cas concret, comment un éditeur saura-t-il comment l'afficher !)
    ça reste LA zone d'ombre pour moi  ???
    Ben c'est pas compliqué, il existe un "empty character" en unicode spécialement pour ça.

    [*]Si tu veux un q avec un point au dessus et un en dessous, tu mets juste la suite de codepoints "q","point au dessus","point en dessous".
    [*]Si tu veux un qu avec un point au dessus, suivi d'un caractère constitué uniquement d'un point en dessous (qui normalement est un caractère de diacritique à  appliquer à  un caractère mais bon), tu mets juste la suite de code points "q","point au dessus","empty","point en dessous".
    --> Au rendu, il va voir que "q" est suivi d'un non-caractère diacritique "point au dessus" (et donc l'appliquer au glyphe), et ensuite on a fini le glyphe (car le caractère/codepoint suivant n'est pas un signe diacritique) et on reprend donc avec un 2e glyphe, qui se trouve être un glyphe "vide" (un peu comme le caractère "espace", limite), auquel on applique la diacritique "point en dessous".

    De plus, je ne sais pas si c'est le cas pour tous les signes diacritiques ou pas, mais il existe souvent plusieurs variantes d'un même glyphe. Voir ce doc officiel : le caractère "accent circonflexe" a ainsi par exemple la variante 0x005E (circonflex accent) et 0x02C6 (modifier letter circonflex accent)... Donc encore une autre façon d'écrire les cas dont tu parles, permettant d'indiquer une diacritique sur aucun caractère au lieu de l'appliquer au caractère précédent.
  • schlumschlum Membre
    07:52 modifié #56
    OK... Du coup, c'est pas géré par la police, mais directement à  l'affichage en superposant les caractères ?
    Je ferai des essais chez moi de mon script d'inversion sur ton "q pointé"  :)
  • AliGatorAliGator Membre, Modérateur
    décembre 2007 modifié #57
    dans 1197559409:
    sur ton "q pointé"  :)
    Hé, ho, je te permets pas !
    Et puis d'abord mon q n'est pas simplement pointé, mais il a deux belles rondeurs :P (il pointe à  la fois en haut et en bas)

    Hum...  :o
  • BruBru Membre
    07:52 modifié #58
    Concernant les diacritiques combinatoires (le fait de pouvoir composer un symbole par concaténation d'un caractère et d'un signe diacritique dans la norme unicode), je vous renvoie sur ce post.
    Ici ça causait du caractère â, qui, en utf8, était possible d'écrire de 2 manières : une sur 2 octets, l'autre sur 3 !

    .
  • schlumschlum Membre
    07:52 modifié #59
    Ouais  ;)
    Ce que j'avais pas compris c'est que les signes diacritiques étaient différents des signes équivalents et qu'on ne pouvait les utiliser seuls...
    Par exemple, pour l'accent aà¯gu :
    - Le signe : 0x00B4
    - Le signe diacritique : 0x0301

    En gros, tout ce qui est entre 0x0300 et 0x036F doit être précédé d'un autre caractère ; et quand on tombe sur un, on se décale pas avant d'afficher  :)

    Merci à  AliGator, j'ai tout compris maintenant  <3 (ce qui ne m'empêchera pas de tester l'inversion de son "q doublement pointé tout en rondeurs")  ;D
  • schlumschlum Membre
    07:52 modifié #60
    unichar cars&#91;] = {0x0071,0x0323,0x0307,0x0041};<br />NSString *str = [NSString stringWithCharacters:cars length:4];<br />NSLog(@&quot;%@ -&gt; %@ , %@&quot;,str,reverseString(str),reverseStringUTF8(str));
    


    inversion.png

    I'm screwed !  :o :o ;D
  • schlumschlum Membre
    07:52 modifié #61
    Allez, on améliore  :)

    NSString *reverseString(NSString *str)<br />{<br />	unsigned int lg = [str length];<br />	unichar buff[lg],buff2[lg];<br />	[str getCharacters:buff];<br />	int i = 0, j = lg;<br />	unsigned int carSz;<br />	while(i&lt;lg) {<br />		carSz = (buff[i]&amp;0xD800)!=0xD800?1:2;<br />		while(buff[i+carSz]&gt;=0x0300&amp;&amp;buff[i+carSz]&lt;=0x036F)<br />			++carSz;<br />		j -= carSz;<br />		memcpy(&amp;buff2[j],&amp;buff[i],carSz*sizeof(unichar));<br />		i += carSz;<br />	}<br />	return [NSString stringWithCharacters:buff2 length:lg];<br />}
    


    Même plus besoin de passer en precomposé canonique :P
Connectez-vous ou Inscrivez-vous pour répondre.