2010-09-17 111 views
2

有人可以帮助我将特殊字符转换为可以在RTF文件中正确表示的东西吗?转换特殊字符为RTF

我正在将文本存储在iPad上的字符串中,并使用NSASCIIStringEncoding将其作为RTF文件输出。到现在为止还挺好。我忽视成功的是考虑到特殊字符(例如,代字符,元音变音,重音等)。很抱歉!

最普遍的RTF格式似乎希望8位文本编码与代码页转义(反斜杠后面的两个十六进制数字)。所以n与波浪号(ñ)会是'f1。

对我来说,唯一的解决方案是转换为NSUTF8StringEncoding,然后使用stringByReplacingOccurrencesOfString,但是有很多字符,而且手动替换每一个字符似乎很繁琐。有没有更有效的方式逃避我? (双关打算):)

谢谢你的任何建议。

+0

只是从web开发中的类似问题的想法...使用Unicode整个? – 2010-09-17 18:27:14

+0

我无法帮助你了解RTF格式的细节,但值得指出的是,从iOS 4.0开始,Apple(最终)引入了正则表达式支持 - 请参阅NSRegularExpression。根据您是否需要支持传统的3.x设备,我会试图使用正则表达式来解决这个特定的问题,因为这正是它们的设计目的。 – Echelon 2010-09-17 18:36:08

+0

感谢分享。这是一个iPad应用程序,所以暂时我必须支持v3.2。 – DenVog 2010-09-17 19:20:28

回答

1

检查characterAtIndex:的值是否大于127,它不是ASCII,所以转义字符。

像下面

- (NSString *)stringFormattedRTF:(NSString *)inputString 
{ 
    NSMutableString *result = [NSMutableString string]; 

    for (int index = 0; index < [inputString length]; index++) { 
     NSString *temp = [inputString substringWithRange:NSMakeRange(index, 1)]; 
     unichar tempchar = [inputString characterAtIndex:index]; 

     if (tempchar > 127) { 
      [result appendFormat:@"\\\'%02x", tempchar]; 
     } else { 
      [result appendString:temp]; 
     } 
    } 
    return result; 
} 
+0

这不按预期工作。将在发现工作解决方案时更新 – falconcreek 2010-09-18 00:48:59

+0

感谢您提出的答案和后续工作。 – DenVog 2010-09-19 15:12:18

+0

固定的方法返回正确的结果 – falconcreek 2010-09-20 02:49:16

3

@ falconcreek的回答为我节省了大量的时间编写代码,以具有更广泛的情况下,包括,比如说,中国的字符(如的要求DenVog)的应对。尤其重要的是检查:“\”,“{”和“}”,因为它们是由RTF格式使用的。 (参见How to output unicode string to RTF (using C#),例如。)上的NSString以下类别与一个字符串,如科佩斯:

快速\慢{棕色}狐狸“咕噜咕噜”懒惰地在他的π-拿铁咖啡,而王菲(王菲)在后台播放。

@interface NSString (TR)  
- (NSString *)stringFormattedRTF; 
@end 

@implementation NSString (TR) 

#define backslash 0x5C 
#define openCurlyBrace 0x7B 
#define closeCurlyBrace 0x7D 

- (NSString *)stringFormattedRTF; 
{ 
    NSMutableString *result = [NSMutableString string]; 

    for (int index = 0; index < [self length]; index++) 
    { 
     unichar unicodeCharacter = [self characterAtIndex: index]; 

     if (unicodeCharacter == backslash || unicodeCharacter == openCurlyBrace || unicodeCharacter == closeCurlyBrace) 
     { 
      [result appendFormat: @"\\%c", unicodeCharacter]; 

     } 
     else if (unicodeCharacter > 127) 
     { 
      [result appendFormat:@"\\uc0\\u%u ", unicodeCharacter]; 
     } 
     else 
     { 
      [result appendFormat:@"%c", unicodeCharacter]; 
     } 
    } 
    return result; 
} 

旁注:微软提供1.9.1 RTF spec,如果你想输出RTF这实在是有帮助的。维基百科称(截至2012年5月)这是最新版本。谷歌倾向于推出更老的RTF规格。

+0

感谢您分享此内容。大括号回来咬我,这帮助我整理出来。感谢您的跟踪。 – DenVog 2012-09-25 14:22:48