Escape двухбайтовые символы для RTF - PullRequest
1 голос
/ 05 октября 2010

Я пытаюсь экранировать двухбайтовые (обычно японские или китайские) символы из строки, чтобы их можно было включить в файл 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;
}

Похоже, что он ищет любые символы Юникода с десятичным значением, превышающим 127 (что в основном означает что-то не ASCII). Если я найду его, я избежу его и переведу в шестнадцатеричное значение.

ПРИМЕР: Небольшое «е» с острым акцентом экранируется и преобразуется в его шестнадцатеричное значение, в результате чего «\ 'e9»

В то время как азиатские символы выше 127 десятичных значений, вывод из вышеприведенного, по-видимому, читает первый байт двухбайтового символа Юникода и кодирует, а затем передает второй байт как есть. Для конечного пользователя это заканчивается ????.

Предложения с благодарностью. Спасибо.

ОБНОВЛЕНО Пример кода, основанный на предложении. Не обнаруживая (

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 Ответ

1 голос
/ 05 октября 2010

Взгляните на код в rangeOfComposedCharacterSequenceAtIndex:, чтобы увидеть, как получить все символы в составном символе.Затем вам необходимо закодировать каждый из символов в результирующем диапазоне.

...