2010-10-04 7 views
1

J'essaie d'échapper des caractères à double octet (généralement japonais ou chinois) à partir d'une chaîne afin qu'ils puissent être inclus dans un fichier RTF. Thanks to poster falconcreek, je peux réussir à échapper des caractères spéciaux (par exemple, tréma, accent, tilde) qui sont à un octet.Échapper les caractères à double octet pour RTF

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

Il semble que cette recherche des caractères unicode avec une valeur décimale supérieure à 127 (ce qui signifie essentiellement rien non ASCII). Si j'en trouve un, je m'échappe et je traduis cela en une valeur hexadécimale.

Exemple: Small « e » avec un accent aigu s'échappé et converti en sa valeur hexadécimale, ce qui dans « \ 'E9"

Bien que les caractères asiatiques sont au-dessus 127 valeur décimale, la sortie de la figure ci-dessus pour être lire le premier octet du caractère double octet unicode et coder celui qui passe ensuite le second octet tel quel. Pour l'utilisateur final, il finit ????

Les suggestions sont grandement appréciées. Merci.

MISE À JOUR Échantillon de code basé sur une suggestion. Ne pas détecter. :(

NSString *myDoubleByteTestString = @"blah は凄くいいアップです blah åèüñ blah"; 
NSMutableString *resultDouble = [NSMutableString string]; 
for (int index = 0; index < [myDoubleByteTestString length]; index++) 
{ 
    NSString *tempDouble = [myDoubleByteTestString substringWithRange:NSMakeRange(index, 1)]; 
NSRange doubleRange = [tempDouble rangeOfComposedCharacterSequenceAtIndex:index]; 
if(doubleRange.length > 2) 
{ 
     NSLog(@"%@ is a double-byte character. Escape it.", tempDouble); 
     // How to escape double-byte? 
    [resultDouble appendFormat:tempDouble]; 
    } 
else 
{ 
     [resultDouble appendString:tempDouble]; 
    } 
} 

Répondre

1

Jetez un oeil sur le code à rangeOfComposedCharacterSequenceAtIndex: pour voir comment obtenir tous les personnages dans un caractère composé. Vous devrez ensuite encoder chacun des caractères dans la gamme résultante.

+0

Merci Pour cette suggestion, je me suis foutu de ce que je peux trouver en rapport avec rangeOfComposedCharacterSequenceAtIndex.J'ai mis une mise à jour de ma question avec la tentative de code en cours.Je n'arrive pas à la détecter, encore moins à échapper les caractères à double octet . – DenVog

Questions connexes