2010-08-01 16 views
1

J'ai une chaîne dans mon interface graphique de cacao qui doit avoir un formatage spécial (polices, couleurs, etc.). Naturellement, j'utilise une chaîne attribuée. Pour plus de commodité, j'INIT la chaîne au format RTF:RTFString contenant des caractères spéciaux NSASCIIStringEncoding?

NSString *inputString = @"This string has special characters"; 
NSString *rtfString = [NSString stringWithFormat:@"{@"***LENGTHY RTF FORMATTING STRING *** %@", inputString]; 
NSAttributedString *testString = [[NSAttributedString alloc] initWithRTF:[rtfString dataUsingEncoding:NSUTF8StringEncoding] documentAttributes:nil]; 

Le problème est, la « inputString » pourrait avoir des caractères spéciaux qui ne sont pas affichés correctement en raison de la UTF8Encoding. Ils sont remplacés par d'autres symboles. é est laissé à ©.

Alors, en ce moment je fais ceci:

NSData* intermediateDataString=[inputString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

inputString = [[[NSString alloc] initWithData:intermediateDataString encoding:NSUTF8StringEncoding] autorelease]; 

Cela ne présente pas les caractères inattendus, mais il ne supprime tous les accents et laisse à leur place la lettre inaccentuée - é est laissée et.

Ceci est une amélioration puisque tout peut être lu, mais il est loin d'être idéale.

Pensées?

Répondre

1

je ferais quelque chose comme ça. Tout d'abord, créez une chaîne attribué factice:

NSString *dummyRTFString = @"***LENGTHY RTF FORMATTING STRING *** A"; 
NSAttributedString *dummyAS = [[NSAttributedString alloc] 
             initWithRTF:[rtfString dataUsingEncoding:NSUTF8StringEncoding] 
           documentAttributes:nil]; 

et obtenir les attributs:

NSDictionary*attributes=[dummyAS attributesAtIndex:0 effectiveRange:NULL]; 
[dummyAS release]; 

Maintenant, je vais utiliser cet attribut pour créer une autre chaîne attribuée:

NSAttributedString* as=[[NSAttributedString alloc] initWithString:inputString attributes:attributes]; 

Une autre approche est de utiliser HTML au lieu de RTF; alors vous pouvez inclure des caractères non-ascii comme unicode dedans.

+0

Je aime bien cette idée. Je vais l'essayer. Merci! –

+0

BELLE !!!! Travaillé comme un charme. Quelle excellente idée! –

0

Dans votre première ligne de code, je suppose que c'est vraiment @"This string has special characters" sinon vous obtiendrez une erreur de compilation. Et il semble que votre deuxième ligne a un @" supplémentaire.

Si vous savez que vous utilisez UTF-8, pourquoi dire NSASCIIStringEncoding?

Vraiment, vous devez mettre la RTF, y compris la chaîne avec des caractères spéciaux dans une ressource, pas intégré dans votre code.

+0

Le texte formaté doit être dynamique, mais le format RTF est le type d'affichage du client. –

+0

Et oui, il y a un "@", je m'obscurcissais un peu ... –