如何在普通C中使用precomposedStringWithCanonicalMapping和CFStringref

时间:2013-03-12 14:17:32

标签: c macos cocoa nsstring cfstring

我需要在Mac Os X中解析最近文件的默认数据库。这是用sed完成的。需要注意的是,文件名存储在那里的分解的utf-16中。

所以,我想,(在指向NSString函数之后)“为什么我不做一个小工具来处理它”。

该工具应该基本上像cat一样工作,它从输入中获取行,它将每行转换为CFStringref对象,在CFStringref 希望转换为预合成的UTF-16之前,我将其转换为回到UTF-8,打印出来。

我不想这么说,但我不知道这个“免费桥接”的工作原理,我无意使用Cocoa和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。

谢谢!

1 个答案:

答案 0 :(得分:0)

也许我错了,但是我通过阅读“免费桥接”的文档得知,并非所有NSString方法都可以在CFString中使用。

所以我转到了Cocoa / 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

案件结案。