2013-03-12 3 views
0

Mac OS X의 최근 파일에 대한 기본 데이터베이스를 구문 분석해야합니다. 이것은 sed를 사용하여 수행됩니다. 주의해야 할 점은 파일 이름은 거기에있는 분해 된 utf-16에 저장된다는 것입니다.일반 C에서 precomposedStringWithCanonicalMapping을 CFStringref와 함께 사용하는 방법

그래서 (NSString 함수를 지적한 후) "왜 그냥 처리하지 않는 작은 도구를 만들지 않을까?"라고 생각했습니다.

이 도구는 기본적으로 고양이처럼 작동하도록되어, 그것은 CFStringref 하기 전에, 그것은 CFStringref 객체로 각 라인을 변환, 입력에서 라인을 얻을 희망는 미리 만들어진 UTF-16으로 변환됩니다, 나는 다시 UTF-로 변환 8, 그것을 인쇄합니다.

나는이 "유료 브리징"작업을 알지 못한다. 나는 이것을 위해 코코아와 Objective C를 사용할 의사가 없다. 단지 CFStringref를 사용하는 스트레이트 솔루션을 원한다. 그러한 해결책이 존재한다면!

감사합니다. 여기

내가 지금까지 가지고 무엇을 :

이 일 것으로 보인다
#define BUFFERSIZE 512     
static void 
precomposedOutput(char *fn) 
{ 
    char buffer[BUFFERSIZE] ; 
    CFStringRef str ; 
    char *outbuf; 
    char *bytes ; 
    FILE *fd = stdin ; 
    if (fn) { 
     fd = fopen(fn,"r"); 
    } 
    while (fgets(buffer, sizeof(buffer),fd)) { 
     bytes = savestr(buffer) ; 
     str = CFStringCreateWithCStringNoCopy(NULL, bytes,kCFStringEncodingUTF8, NULL); 
     /* CONVERSION INTO PRECOMPOSED IS SUPPOSED TO HAPPEN HERE */ 
     outbuf = Copy_CFStringRefToCString(str) ; 
     CFRelease(str) ; 
    fputs(outbuf,stdout) ; 
    free(outbuf) ;   
    } 
} 

, 지금까지 앞뒤로 변환에, (. 누출 거기에를 실행하지) 내가 도움이 필요 무엇, CFString을 사전 구성된 UTF-16으로 변환하는 것입니다.

감사합니다.

답변

0

어쩌면 내가 틀렸을 수도 있지만 "무료 브리지"를 위해 문서를 읽으므로 NSString의 모든 메소드가 CFString에서 사용할 수있는 것은 아닙니다.

그래서 저는 코코아/Objective-C로 옮겼습니다.

static void 
precomposedOutput(char *fn) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    char buffer[BUFFERSIZE] ; 
    char *outbuf; 
    FILE *fd = stdin ; 
    if (fn) { 
     fd = fopen(fn,"r"); 
    } 
    while (fgets(buffer, sizeof(buffer),fd)) { 
     NSString *str = [[NSString alloc] initWithUTF8String:buffer]; 
     NSString *str_precomp = [[NSString alloc ] initWithString:[str precomposedStringWithCanonicalMapping]] ; 
     outbuf = (char *)[str_precomp UTF8String] ; 
     [str release ] ; 
     [str_precomp release ] ; 
     fputs(outbuf,stdout) ; 
    } 
    [pool drain]; 
} 

글쎄, 그것은 작동하지만, 내 근본적인 문제는 문자열이 파이프 라인을 통해 간 이후, 분해 된 문자가 "\\ U"와 같은 리터럴 문자열 여러 바이트 저장, 그들 앞에 있다는 것입니다. 그 동안 Applescript의 루틴이 작성되었으므로 작업을 수행하는 데 "도구"를 사용하는 것보다 훨씬 간단합니다. (http://macscripter.net/viewtopic.php?pid=161135#p161135)

케이스가 닫혔습니다.