2011-04-28 8 views
0

첫째, 내가 왜이 일을하고있어 간단한 설명 :이스케이프 분음 부호

내가 XML에서 문자열을로드하고, 기존의 자바 스크립트와 상호 작용이 사용하고를 기능. 나는 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]; 
} 

. 예를 들어, "é"는 "Ã ©"로 표시됩니다.

따라서 발음 구별을 어떻게 피할 수 있습니까?

답변

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); 
+0

굉장! 고맙습니다. – michael

+0

특정 UTF-8 헤드 바이트가 특별한 케이싱 (special-casing)의 요점은 무엇인지 모르겠습니다. 이스케이프가 필요한 ASCII 바이트를 특수한 경우에만 사용하고 높은 바이트를 바이트로 처리 할 때 UTF-8을 무시하십시오. 물론 이들의 유효성 검사를 원할 수도 있지만,이 경우에는이 대답보다 더 많은 (그리고 다른) 논리가 필요합니다. –