我需要在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。
谢谢!
答案 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)
案件结案。