2010-08-01 109 views
1

我在我的可可GUI中有一个字符串,它需要特殊的格式(字体,颜色等)。当然,我使用的是一个属性字符串。为了方便起见,我初始化字符串为RTF:RTFString包含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]; 

的问题是,在“inputString”可能有特殊字符,这是不正确显示由于UTF8Encoding。它们被替换为其他符号。 é保留为Å©。

所以,现在我这样做:

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

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

这不显示意外字符,但它确实删除所有口音和代替他们离开重音字母 - é留作e

这是一个改进,因为一切都可以阅读,但它是非常不理想。

想法?

回答

1

我会做这样的事情。首先,创建一个虚拟属性串:

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

,并获得属性:

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

现在,我将使用这个属性来创建另一个属性串:

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

另一种方法是使用HTML而不是RTF;那么你可以在其中包含非ASCII字符作为unicode。

+0

我更喜欢这个想法。我会尝试一下。谢谢! – 2010-08-01 18:49:10

+0

美丽!像魅力一样工作。多么好的主意! – 2010-08-01 19:02:36

0

在你的第一行代码中,我假设这真的是@"This string has special characters"否则你会得到一个编译错误。它看起来像你的第二行有一个额外的@"

如果你知道你使用UTF-8,为什么说NSASCIIStringEncoding

真的,你应该把RTF包括带有特殊字符的字符串放在一个资源中,而不是嵌入到你的代码中。

+0

格式化的文本必须是动态的,但RTF是客户端的显示类型。 – 2010-08-01 18:47:06

+0

是的,有一个“@”,我混淆了一下...... – 2010-08-01 18:47:27