【问题标题】:How do I use precomposedStringWithCanonicalMapping with CFStringref in plain C如何在纯 C 中使用 precomposedStringWithCanonicalMapping 和 CFStringref
【发布时间】:2013-03-12 14:17:31
【问题描述】:

我需要在 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) ;         
  }
}

到目前为止,这似乎在来回转换方面有效(不要在其上运行 leaks。) 我需要帮助的是将 CFString 转换为预先组合的 UTF-16。

谢谢!

【问题讨论】:

    标签: c macos cocoa nsstring cfstring


    【解决方案1】:

    也许我错了,但我通过阅读“免费桥接”的文档发现并非 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-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2010-10-31
      相关资源
      最近更新 更多