2013-09-06 8 views
1

내가 현재 코드를 가지고 있으며 전자하기 CFShow이 \u00e9의 유니 코드 UTF8 인코딩을 변환하지 않는 사실을 제외하고는 제대로 작동 않습니다CoreFoundation에서 인쇄 유니 코드 문자

#include <CoreFoundation/CoreFoundation.h> 

int main() 
{ 

    char *s = "This is a test of unicode support: fiancée\n"; 
    CFTypeRef cfs = CFStringCreateWithCString(NULL, s, kCFStringEncodingUTF8); 
    CFShow(cfs); 

} 

출력

This is a test of unicode support: fianc\u00e9e 
             |____| 
              > é doesn't output properly. 
입니다

CFShow가 유니 코드임을 어떻게 지시합니까? printf는 C 문자열 일 때 잘 처리합니다.

+0

'CFShow'가 문자열이 유니 코드라고 이미 믿지 않았다면 문자를 해석하고'\ u' 이스케이프를 사용하지 않을 것입니다. '\ xC3 \ xA9' 같은 것을 보게 될 것입니다. –

답변

1

CFShow은 문자열이 유니 코드임을 알고 있지만 콘솔의 유니 코드 형식을 지정하는 방법을 알지 못합니다. 나는 당신이 아무것도 할 수는 없지만 대체물을 찾을 수 있을지는 의심 스럽다. 아마도 NSLog 일 것이다.

+0

NSLog는 객관적인 C이지만 그렇지 않습니까? 나는 C와 C++에 충실하려고 노력하고 있으므로 어셈블리에서 쉽게 사용할 수 있습니다 (Apple이 피하려고하는 것). – Zimm3r

+0

예, NSLog는 Objective-C입니다. 그러나 당신은 CFStringRef를 받아서 그것을 'NSLog'에 전달하는 래퍼 함수를 ​​작성할 수 있습니다. 따라서 Objective-C를 하나의 작은 파일로 한정하십시오. – JWWalker

+0

나는 객관적인 c를 피하려고 노력하고있다. 불가능한 사과가 너무 슬프게도 사용하는 것처럼 보인다. 오, 이제 어셈블리 내부에서 호출하는 방법을 찾으려고합니다. 많은 oj objc_msgSend 호출처럼 보입니다. – Zimm3r

5

CFShow()은 디버깅 전용입니다. 모호성을 피하기 위해 고의로 ASCII가 아닌 코드를 이스케이프 코드로 변환합니다. 예를 들어 "é"는 U + 00E9 라틴 소문자 E와 급행 또는 U + 0065 라틴 소문자 E와 U + 0301 급행 동의 합법의 두 가지 방식으로 표현 될 수 있습니다. CFShow()이 UTF-8 시퀀스를 내보내는 경우 터미널에 "é"로 표시되고 문자열에 어떤 변형이 있었는지 알 수 없습니다. 디버깅을 위해 CFShow()의 유용성을 떨어 뜨릴 수 있습니다.

CFShow()의 출력이 무슨 내용인지 알고있는 이유는 무엇입니까?

+0

C 라이브러리에 의존하지 않고 printf를 사용하지 않고 콘솔에 출력으로 사용합니다. 따라서 Mac OS X API Core Foundation을 사용하여 Win API 함수를 사용하여 콘솔로 출력하는 방법과 함께 사용할 수 있습니다. – Zimm3r

+0

@ Zimm3r : 그건'CFShow'가하는 것이 아닙니다. 'CFShow'는 일반적인 내용이 아닌 디버깅 목적으로 문자열의 내용을 엿보는 데 사용됩니다. CFString을 stdout 또는 stderr에 쓰는 올바른 방법에 대해 별도의 질문을해야합니다. 나에게 링크를 보내면 내가 대답 할게. –

+0

'CFShow()'는 문자열의 일반적인 인쇄 (또는 다른 것)에 적합하지 않습니다. 내가 말했듯이, 그것은 디버깅 기능이다. C 라이브러리와 stdio를 피하기로 결정했다면,'CFStringCreateExternalRepresentation()'또는'CFStringGetCString()'을 사용하여 UTF-8로 인코딩 된 바이트 버퍼를 얻고'write()'등을 사용하여 출력 할 수 있습니다. –