2 votes

Convertir les caractères spéciaux pour RTF

Quelqu'un peut-il m'aider à convertir les caractères spéciaux en quelque chose qui puisse être correctement représenté dans un fichier RTF ?

Je prends du texte stocké dans une chaîne sur l'iPad et je le sors sous forme de fichier RTF en utilisant NSASCIIStringEncoding. Jusqu'à présent, tout va bien. Ce que j'ai négligé de faire avec succès, c'est de prendre en compte les caractères spéciaux (par exemple, tilde, tréma, accent, etc.). Désolé RdM !

Le format RTF le plus universel semble vouloir un encodage de texte sur 8 bits avec échappement de page de code (deux chiffres hexadécimaux suivant une barre oblique inverse). Ainsi, n avec le tilde (ñ) serait \'f1.

La seule solution qui me vient à l'esprit est de convertir en NSUTF8StringEncoding et d'utiliser ensuite stringByReplacingOccurrencesOfString, mais il y a beaucoup de caractères et il semble fastidieux de devoir remplacer chacun d'entre eux manuellement. Existe-t-il une méthode plus efficace qui m'échappe (jeu de mots) :)

Merci de vos suggestions.

5voto

Obliquely Points 4465

La réponse de @falconcreek m'a permis de gagner beaucoup de temps en écrivant du code pour gérer un plus grand nombre de cas, y compris, par exemple, les caractères chinois (comme demandé par DenVog). En particulier, il est important de vérifier la présence de : "\", "{" et "}" car ils sont utilisés par le format RTF. (Voir Comment convertir une chaîne unicode en RTF (en utilisant C#) par exemple). La catégorie suivante sur NSString s'occupe d'une chaîne de caractères telle que :

Le renard brun, rapide et lent, se délecte paresseusement de son π-latté, tandis que Faye Wong (王菲) joue en arrière-plan.

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

Note complémentaire : Microsoft fournit 1.9.1 Spécification RTF ce qui est très utile si vous voulez produire du RTF. Wikipedia indique (en date de mai 2012) qu'il s'agit de la version la plus récente. Google a tendance à faire remonter des spécifications RTF beaucoup plus anciennes.

2voto

falconcreek Points 3657

Vérifier la valeur de characterAtIndex: s'il est > 127, il ne s'agit pas d'un caractère ASCII, il faut donc l'échapper.

Quelque chose comme ce qui suit

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X