2010-09-17 188 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