2010-08-23 6 views
0

이 함수에서는 emotes라는 IBOutlet에 연결된 NSArrayController의 NSTableView에서 선택한 이모티콘을 가져옵니다. 선택한 NSArray의 문자열에는 클립 보드로 전송되는 UTF8 문자가 포함됩니다.NSString 및 UTF8 16 진수 변환

// Get Selected Emoticon 
NSArray * selectedemote = [emotes selectedObjects]; 
NSLog(@"%@",[selectedemote valueForKey:@"emote"]); 
// Send to Clipboard 
[self copyToClipboard:[NSString stringWithFormat:@"%@",[selectedemote valueForKey:@"emote"]]]; 

문제는 NSArray 자체에서 발생합니다. 그것은 UTF8 문자열을 16 진수로 출력하는 것 같습니다. 수정 UTF-8 문자에 UTF-8 진수를 변환하는 가능한 방법이

2010-08-23 11:23:56.411 Emoticon[7919:a0f] (
    "\\(\U2579\U30ee\U2579)/" 
) 

거기 다음은 문자열이 NSLog 함수에서 보이는 무엇인가? 감사.

+1

이 문자열은 UTF-8 아무 것도 포함되어 있지 않습니다. UTF-8은 인코딩입니다. 인코딩을 사용하여 문자열에서 데이터를 생성하거나 데이터에서 문자열을 디코딩 할 수 있습니다. 따라서 문자열의 문자를 인코딩하는 UTF-8 데이터 나 UTF-16 데이터를 가질 수 있지만 문자열에는 문자 만 포함됩니다. –

답변

1

나는이 문제를 해결했다. 해결 방법은 NSEntityDescription을 사용하고 선택한 셀과 함께 NSArray의 objectAtIndex : 0과 함께 init을 수행하는 것입니다. NSEntityDescription을 사용하여 Emote에 대한 가치를 얻었습니다.

-(IBAction)sendtoclipboard:(id)sender 
{ 
    // Get Selected Emoticon 
    NSArray * selectedemote = [emotes selectedObjects]; 
    NSEntityDescription *entity = [selectedemote objectAtIndex:0]; 
    NSString * tmpemote = [NSString stringWithFormat:@"%@",[entity valueForKey:@"emote"]]; 
    NSLog(@"%@", [entity valueForKey:@"emote"]); 
    //Send to Clipboard 
    [self copyToClipboard:tmpemote]; 
} 

결과 :

2010-09-07 20:03:26.488 Emoticon[45764:a0f] \(╹ヮ╹)/ 
0

문제는 NSArray 자체에서 발생합니다. 그것은 UTF8 문자열을 16 진수로 출력하는 것 같습니다.

내 의견에 언급했듯이 문자열은 UTF-8이 아닙니다. 문자열은 데이터에서 생성하거나 데이터에서 데이터를 만들 때를 제외하고는 인코딩과 관련이 없습니다. 여기

는 문자열이 NSLog 함수의 모습입니다 :

2010-08-23 11:23:56.411 Emoticon[7919:a0f] (
    "\\(\U2579\U30ee\U2579)/" 
) 

있는 NSArray는 이전 스타일의 재산 목록 형식의 문자열을 반환하여 자신을 설명합니다. 그 형식은 ASCII 여야합니다. 따라서 배열은 \U 시퀀스로 문자열의 비 ASCII 문자를 이스케이프 처리합니다. 이것은 예상대로 작동하며 배열의 설명에 따라 다릅니다. 문자열을 직접 기록하면 볼 수 있듯이 문자열은 변경되지 않습니다.

배열을 클립 보드에 넣으려면 그렇게하십시오. 균일 한 유형 식별자 (yourdomain.yourappname.typename)를 만들어 붙여 넣기가 해당 유형의 속성 목록 값으로 배열을 설정하도록 지시해야합니다. 또한 일부 분리 기호 (예 : @"\n")를 사용하여 문자열을 결합하고 텍스트 편집기 및 텍스트 필드에 쉽게 붙여 넣을 수 있도록 문자열을 대문자로 붙여 넣을 수 있도록 배열에 지시 할 수 있습니다.

+0

그게 문제를 설명하지만 여전히 문제를 해결할 해결책이 아닙니다. 나는 그것을 시험해보고 스스로 이해할 것이다. – chikorita157

+0

chikorita157 : 아니, 문제가 없다고 설명합니다. 문자열이 배열에 표시된대로 이스케이프 처리되지 않습니다. 배열 자체에 대한 설명에서만 이스케이프를 수행합니다. 말했듯이, 배열을 로깅하는 대신 문자열을 직접 기록하십시오. 그러면 문자열의 참된 내용을 볼 수 있습니다. –