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