[英]How do I use precomposedStringWithCanonicalMapping with CFStringref in plain C
我需要在Mac Os X中解析“最近的文件”的默認數據庫。這是通過sed完成的。 需要注意的是文件名存儲在分解后的utf-16里面。
因此,我想(在指向NSString函數之后)“為什么我不只是制作一個可以解決這個問題的小工具”。
該工具應該工作基本上像貓,它得到線從輸入,將其轉換的每一行成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。
謝謝!
也許我錯了,但是通過閱讀“免費橋接”文檔,我發現CFString中並非所有NSString方法都可用。
所以我搬到了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 )
案件結案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.