Экранирование диакритических знаков в строке UTF8 из C / Obj-C в JavaScript - PullRequest
0 голосов
/ 29 апреля 2011

Во-первых, краткое объяснение, почему я делаю это:

Я загружаю строки из XML и использую их для взаимодействия с существующими функциями JavaScript. Мне нужно избегать их, только потому, что я использую метод stringByEvaluatingJavaScriptFromString в веб-представлении.

Я использую эту escape-функцию:

- (NSString *) stringByEscapingMetacharacters
{    
    const char *UTF8Input = [self UTF8String];
    char *UTF8Output = [[NSMutableData dataWithLength:strlen(UTF8Input) * 4 + 1  /* Worst case */] mutableBytes];
    char ch, *och = UTF8Output;

    while ((ch = *UTF8Input++))
        if (ch == '\'' || ch == '\'' || ch == '\\' || ch == '"')
        {
            *och++ = '\\';
            *och++ = ch;
        } 
        else if (isascii(ch))
            och = vis(och, ch, VIS_NL | VIS_TAB | VIS_CSTYLE, *UTF8Input);
        else
            och+= sprintf(och, "\\%03hho", ch);
    return [NSString stringWithUTF8String:UTF8Output];
}

Работает нормально, кроме диакритических знаков. Например, «é» отображается как «Ã ©»

Итак, как мне избежать диакритики?

1 Ответ

1 голос
/ 29 апреля 2011

Вам необходимо реализовать правильный выход последовательности UTF-8.Как то так:

if (ch == '\'' || ch == '\'' || ch == '\\' || ch == '"')
{
    *och++ = '\\';
    *och++ = ch;
} 
else if (((unsigned char)ch & 0xe0) == 0xc0) // 2 byte utf8 sequence
{
    *och++ = ch;
    *och++ = UTF8Input++;
}
else if (((unsigned char)ch & 0xf0) == 0xe0)  // 3 byte utf8 sequence
{
    *och++ = ch;
    *och++ = UTF8Input++;
    *och++ = UTF8Input++;
}
else if (isascii(ch))
     och = vis(och, ch, VIS_NL | VIS_TAB | VIS_CSTYLE, *UTF8Input);
...