我试图从字符串中转义双字节(通常是日语或中文)字符,以便它们可以包含在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];
}
}
答案 0 :(得分:1)
查看rangeOfComposedCharacterSequenceAtIndex:
处的代码,了解如何获取组合字符中的所有字符。然后,您需要对结果范围内的每个字符进行编码。