转换RTF的特殊字符

时间:2010-09-17 18:11:36

标签: iphone ipad character-encoding rtf

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

我正在使用存储在iPad上的字符串中的文本,并使用NSASCIIStringEncoding将其作为RTF文件输出。到现在为止还挺好。我忽略了成功的做法是考虑特殊字符(例如代字号,变音符号,重音符号等)。对不起,罗恩!

最通用的RTF格式似乎需要8位文本编码和代码页转义(反斜杠后面的两个十六进制数字)。因此,使用波浪号(ñ)的n将是\'f1。

我遇到的唯一解决方案是转换为NSUTF8StringEncoding,然后使用stringByReplacingOccurrencesOfString,但是有很多字符,并且必须手动替换它们中的每一个都很繁琐。是否有更有效的方式逃避我? (双关语):))

感谢您的任何建议。

2 个答案:

答案 0 :(得分:3)

@ falconcreek的答案为我节省了大量时间来编写代码以应对更广泛的案例,包括中文字符(根据DenVog的要求)。特别是,检查:“\”,“{”和“}”非常重要,因为这些是RTF格式使用的。 (例如,请参阅How to output unicode string to RTF (using C#)。)NSString上的以下类别应对字符串,例如:

  

快速\慢{棕色}狐狸在他的π-latté上懒洋洋地“懒散”,而王菲则在后台扮演。

@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;
}

旁注: Microsoft提供1.9.1 RTF spec,如果您想输出RTF,这非常有用。维基百科称(截至2012年5月)这是最新版本。谷歌倾向于推出更旧的RTF规范。

答案 1 :(得分:1)

检查characterAtIndex:的值是否为&gt; 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;
}