我的cocoa GUI中有一个字符串,需要特殊的格式(字体,颜色等)。当然,我正在使用属性字符串。为方便起见,我将字符串初始化为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];
问题是,“inputString”可能有特殊字符,由于UTF8Encoding而无法正确显示。它们被其他符号取代。 é留下Å©。
所以,现在我正在这样做:
NSData* intermediateDataString=[inputString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
inputString = [[[NSString alloc] initWithData:intermediateDataString encoding:NSUTF8StringEncoding] autorelease];
这不会显示意外的字符,但它会删除所有重音符号,而不是非重音字母 - é保留为 e 。
这是一项改进,因为一切都可以阅读,但它远非理想。
思想?
答案 0 :(得分: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。
答案 1 :(得分:0)
在你的第一行代码中,我认为这确实是@"This string has special characters"
,否则你会遇到编译错误。看起来你的第二行有一个额外的@"
。
如果您知道自己使用的是UTF-8,为什么要说NSASCIIStringEncoding
?
实际上,你应该把包含带有特殊字符的字符串的RTF放在资源中,而不是嵌入代码中。