【问题标题】:Escaping diacritics in a UTF8 string from C/Obj-C to javascript将 UTF8 字符串中的变音符号从 C/Obj-C 转义到 javascript
【发布时间】:2011-04-28 20:30:27
【问题描述】:

首先,简要说明我这样做的原因:

我正在从 XML 加载字符串,并使用这些字符串与现有的 javascript 函数进行交互。我需要转义它们,只是因为我使用的是 webview 的 stringByEvaluatingJavaScriptFromString 方法。

我正在使用这个转义函数:

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

它工作正常,除了变音符号。例如,“é”显示为“é”

那么,我怎样才能摆脱变音符号呢?

【问题讨论】:

    标签: objective-c c string uiwebview diacritics


    【解决方案1】:

    您需要实现正确的 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);
    

    【讨论】:

    • 我不明白特殊大小写某些 UTF-8 头字节的意义是什么。只需对需要转义的 ASCII 字节进行特殊处理,并在将高字节视为字节时忽略 UTF-8。当然,您可能希望验证它们,但在这种情况下,您需要比此答案提供的更多(和不同)逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2012-10-03
    • 2010-10-04
    • 1970-01-01
    • 2011-02-03
    • 2016-01-16
    相关资源
    最近更新 更多