0

我需要在 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。

谢谢!

4

1 回答 1

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

结案。

于 2013-03-12T16:30:42.893 回答