Конвертировать специальные символы для RTF - PullRequest
2 голосов
/ 17 сентября 2010

Может ли кто-нибудь помочь мне с преобразованием специальных символов во что-то, что может быть правильно представлено в файле RTF?

Я беру текст, хранящийся в строке на iPad, и выводю его в виде файла RTF, используя NSASCIIStringEncoding,Все идет нормально.То, что я забыл сделать успешно, это принять во внимание специальные символы (например, тильда, умлаут, акцент и т. Д.).Извините, RoW!

Наиболее универсальный формат RTF, по-видимому, требует 8-битного кодирования текста с экранированием кодовой страницы (две шестнадцатеричные цифры после обратной косой черты).Таким образом, n с тильдой (ñ) будет \ 'f1.

. Единственное решение, которое мне приходит в голову, - это преобразовать в NSUTF8StringEncoding, а затем использовать stringByReplacingOccurferencesOfString, но есть много символов, и, кажется, утомительно менятькаждый из них вручную.Есть ли более эффективный способ избежать меня?(каламбур):)

Спасибо за любые предложения.

Ответы [ 2 ]

3 голосов
/ 09 мая 2012

@ ответ Falconcreek сэкономил мне много времени на написание кода для решения более широкого круга случаев, включая, скажем, китайские иероглифы (по запросу DenVog). В частности, важно проверить: "\", "{" и "}", поскольку они используются форматом RTF. (См. Как вывести строку Unicode в RTF (используя C #) , например.) Следующая категория на NSString справляется со строкой, такой как:

Быстрая \ медленная {коричневая} лиса лениво «хлюпала» на своем π-латте, а Фэй Вонг (ong) играла на заднем плане.

@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 , что очень полезно, если вы хотите вывести RTF. Википедия говорит (по состоянию на май 2012 года) это самая последняя версия. Google стремится поднять гораздо более старые спецификации RTF.

1 голос
/ 17 сентября 2010

Проверьте значение 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;
}
...