views:

51

answers:

2

I have a string in my cocoa GUI that needs to have special formatting (fonts, colors, etc.). Naturally, I'm using an attributed string. For convenience, I Init the string as an RTF:

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];

The problem is, the "inputString" might have special characters, which are not displayed properly due to the UTF8Encoding. They're replaced with other symbols. é is left as Å©.

So, right now I'm doing this:

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

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

This does not display the unexpected characters, but it does remove all accents and leaves in their stead the unaccented letter - é is left as e.

This is an improvement since everything can be read, but it is far from ideal.

Thoughts?

+1  A: 

I would do something like this. First, create a dummy attributed string:

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

and obtain the attributes:

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

Now I will use this attribute to create another attributed string:

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

Another approach is to use HTML instead of RTF; then you can include non-ascii characters as unicode in it.

Yuji
I rather like this idea. I'll try it out. Thanks!
Andrew J. Freyer
BEAUTIFUL!!!! Worked like a charm. What an excellent idea!
Andrew J. Freyer
A: 

In your first line of code, I assume that's really @"This string has special characters" otherwise you'd get a compile error. And it looks like your second line has an extra @".

If you know you're using UTF-8, why say NSASCIIStringEncoding?

Really, you should put the RTF including the string with special characters in a resource, not embedded in your code.

JWWalker
The formatted text has to be dynamic, but the RTF is the client's display type of choice.
Andrew J. Freyer
And yes, there is an "@", I was obfuscating a bit...
Andrew J. Freyer