2012-01-13 6 views
7

나는 Objective-C를 처음 사용하여 변형 된 UTF8로 인코딩 된 NSString을 apples docs에있는 예제를 사용하여 올바른 형식의 NSString으로 변환하려고합니다.NSString을 사용하여 UTF8 디코딩

NSString *theString = @"Lügen"; //should be "ü" 
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding]; 

NSLog(@"Original: %@ (length %d)", theString, [theString length]); 
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]); 

결과 : 여기

Original: Lügen (length 6) 
Converted: LA1/4gen (length 8) 

이 아무것도하지 않는 것입니다 :

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSASCIIStringEncoding]]; 

을이 여기에 내 응용 프로그램

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSUTF8StringEncoding]]; 

누구나 내가 잘못 뭐하는 거지 어떤 생각을 충돌?

+0

문자열을 16 진수로 덤프 할 수 있습니까? 유창하게 기형의 UTF8을 읽지 않습니다 :) –

+0

이것은 "ü"16 진수 값을 얻는 방법을 모릅니다;) –

+0

충돌과 관련된 모든 질문에 충돌의 세부 사항을 게시하십시오. – jrturton

답변

14
NSString *string = @"ü"; 
const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding]; 
NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",newString); // ü 

"잘못된 UTF-8 시퀀스"는 UTF-8에서 유효하지 않은 바이트 시퀀스를 의미합니다. 문자열의 원래 작성자가 사용한 것과 다른 인코딩으로 문자열을 구문 분석 한 후 예기치 않은 결과가 발생합니다. UTF-8 인코딩 파싱

진수 데이터 C3 BC문자 ü이다. 대신 Latin-1 인코딩을 사용하여 ü이됩니다. 그런 다음 당신은 라틴어 -1 문자열을 UTF-16 문자열 (NSString의 네이티브 형식)으로 변환 한 Latin-1 파싱 된 문자열에서 NSString을 만들었습니다.

다른 인코딩으로 주어진 데이터를 나타내면 다른 문자로 나타나지만 데이터는 변경되지 않습니다. 다른 인코딩으로 변환하면 동일한 문자를 재생하기 위해 데이터가 변경됩니다. 예 : 문자 ü은 UTF-8의 경우 C3 83 C2 BC이지만 라틴어 -1의 경우 C3 BC입니다. 그래서 라틴 -1에서 같은 문자로 변환하여 원래 데이터를 얻은 다음 UTF-8로 구문 분석했습니다.

+0

정말 고마워요 :) –

관련 문제