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 に答える