转义RTF的双字节字符

时间:2010-10-04 22:59:15

标签: iphone encoding escaping rtf cjk

我试图从字符串中转义双字节(通常是日语或中文)字符,以便它们可以包含在RTF文件中。 Thanks to poster falconcreek,我可以成功地转义单字节的特殊字符(例如变音符号,重音符号,代字号)。

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

看来这是在寻找十进制值大于127的任何unicode字符(这基本上意味着任何不是ASCII的字符)。如果我找到一个,我将其转义并将其转换为十六进制值。

示例:具有急性重音的小“e”被转义并转换为其十六进制值,从而产生“\'e9”

当亚洲字符大于127十进制值时,上面的输出似乎是读取unicode双字节字符的第一个字节和编码,然后按原样传递第二个字节。对于最终用户,它最终会结束????。

非常感谢您的建议。感谢。

根据建议更新代码示例。没有检测到。 :(

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

1 个答案:

答案 0 :(得分:1)

查看rangeOfComposedCharacterSequenceAtIndex:处的代码,了解如何获取组合字符中的所有字符。然后,您需要对结果范围内的每个字符进行编码。