【问题标题】:RTFString Containing NSASCIIStringEncoding Special Characters?RTFString 包含 NSASCIIStringEncoding 特殊字符?
【发布时间】:2010-08-01 17:14:26
【问题描述】:

我的 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

这是一个改进,因为所有内容都可以读取,但远非理想。

想法?

【问题讨论】:

    标签: objective-c cocoa utf-8 ascii rtf


    【解决方案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。

    【讨论】:

    • 我比较喜欢这个主意。我会尝试一下。谢谢!
    【解决方案2】:

    在您的第一行代码中,我假设这确实是@"This string has special characters",否则您会收到编译错误。而且看起来你的第二行多了一个@"

    如果您知道自己使用的是 UTF-8,为什么还要说 NSASCIIStringEncoding

    确实,您应该将包含带有特殊字符的字符串的 RTF 放入资源中,而不是嵌入到您的代码中。

    【讨论】:

    • 格式化文本必须是动态的,但 RTF 是客户端选择的显示类型。