Cocoa備忘録。
日本語のフォルダが含まれたパスとか来ちゃった場合に開けなくて困ったりした時。
[NSString stringWithCString:cstr]ではなく[filemanager stringWithFileSystemRepresentation:cstr length:len]でパスのNSStringを作るが良いという話。
というものをpathtest.mとして。
するってぇとこうなる。
横着しないでドキュメントは良く読もうという事ですな。
日本語のフォルダが含まれたパスとか来ちゃった場合に開けなくて困ったりした時。
[NSString stringWithCString:cstr]ではなく[filemanager stringWithFileSystemRepresentation:cstr length:len]でパスのNSStringを作るが良いという話。
#import <stdio.h> #import <string.h> #import <Foundation/Foundation.h> int main(int argc, char *argv[]) { NSAutoreleasePool *apool ; NSFileManager *fm; NSString *cstrString, *sysRepString; int i; apool = [[NSAutoreleasePool alloc] init]; fm = [NSFileManager defaultManager]; for(i=1;i<argc;i++){ printf("input C string path = %s\n", argv[i]); // Bad for multi byte string path cstrString = [NSString stringWithCString:argv[i]]; printf("use NSString's +stringWithCString: => "); if( [fm fileExistsAtPath:cstrString] ) printf("file exists!\n"); else printf("file not exists.\n"); // Good for multi byte string path sysRepString = [fm stringWithFileSystemRepresentation:argv[i] length:strlen(argv[i]) ]; printf("use NSFileManager's -stringWithFileSystemRepresentation:length: => "); if( [fm fileExistsAtPath:sysRepString] ) printf("file exists!\n"); else printf("file not exists.\n"); } [apool release]; return 0; }
というものをpathtest.mとして。
> > ls testdir/ ascii_path.txt マルチバイトパス.txt > > cc -Wall -o pathtest pathtest.m -framework Foundation > > ./pathtest testdir/* input C string path = testdir/ascii_path.txt use NSString's +stringWithCString: => file exists! use NSFileManager's -stringWithFileSystemRepresentation:length: => file exists! input C string path = testdir/マルチバイトパス.txt use NSString's +stringWithCString: => file not exists. use NSFileManager's -stringWithFileSystemRepresentation:length: => file exists! >
するってぇとこうなる。
横着しないでドキュメントは良く読もうという事ですな。