将 UTF8 字符串中的变音符号从 C/Obj-C 转义为 javascript

发布于 2024-11-03 19:13:13 字数 889 浏览 1 评论 0原文

首先,简要解释一下我这样做的原因:

我从 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];
}

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

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

First, a brief explanation of why I'm doing this:

I'm loading strings from XML, and using these to interact with existing javascript functions. I need to escape them, only because I'm using the webview's stringByEvaluatingJavaScriptFromString method.

I'm using this escape function:

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

It works fine, except for diacritics. For example, "é" shows up as "é"

So, how can I escape the diacritics?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

林空鹿饮溪 2024-11-10 19:13:13

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

You need to implement proper UTF-8 sequences escapement. Something like this:

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文