2010-09-17 2 views
2

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

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

Самый универсальный формат RTF, похоже, требует 8-битного кодирования текста с escape-кодом (две шестнадцатеричные цифры после обратной косой черты). Итак, n с тильдой (ñ) будет \ f1.

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

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

+0

Просто мысль из похожих проблем в веб-разработке ... используйте Unicode повсюду? –

+0

Я не могу вам помочь в специфике формата RTF, но стоит отметить, что с iOS 4.0 Apple (наконец) внедрила поддержку регулярных выражений - см. NSRegularExpression. В зависимости от того, нужно ли вам поддерживать устаревшие устройства 3.x или нет, у меня возникло бы желание использовать регулярные выражения для решения этой конкретной проблемы, так как это именно то, для чего они были предназначены. – Echelon

+0

Спасибо, что поделились этим. Это приложение для iPad, поэтому на данный момент я должен поддерживать v3.2. – DenVog

ответ

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

+0

Спасибо за предложенный ответ и последующее наблюдение. – DenVog

+0

Исправлен метод возврата правильного результата – falconcreek

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

Side Примечание: Microsoft обеспечивают 1.9.1 RTF spec, которая на самом деле полезно, если вы хотите вывести RTF. Википедия говорит (по состоянию на май 2012 года) эту самую последнюю версию. Google имеет тенденцию поднимать гораздо более старые спецификации RTF.

+0

Спасибо, что поделились этим. Скобки вернулись, чтобы укусить меня, и это помогло мне разобраться. Спасибо, что следили за потоком. – DenVog

Смежные вопросы