如何解决NSTask调用 - [NSString fileSystemRepresentation]的参数

has*_*seg 5 unicode macos cocoa objective-c nstask

似乎NSTask调用-[NSString fileSystemRepresentation]为您提供的每个参数编码值.

在某些情况下,由于-fileSystemRepresentation使用分解的unicode形式进行编码,这可能会成为问题:例如,a-umlaut(ä)将被编码为U + 0061(拉丁文小写字母a)和U + 0308(结合分音符) ,而不是U + 00E4(带有分音符的拉丁文小写字母a).-UTF8String另一方面,该方法似乎恰恰相反.

我需要NSTask使用组合形式对我的参数进行编码.我该如何解决这个问题?

has*_*seg 5

一个可能的解决方案是子类化NSString并提供您自己的 实现-fileSystemRepresentation,但不幸的是,NSString它是一个类簇,因此很难子类化(Apple 的文档也不鼓励这样做)。

\n\n

但是,我们可以创建一个单独的类,该类冒充NSString但提供其自己的实现-fileSystemRepresentation

\n\n

然而,如果NSTask对参数对象的类标识进行任何操作,这可能会产生问题。目前我没有证据表明 \xe2\x80\x94 是这种情况,这个解决方法似乎工作得很好。

\n\n

标题:

\n\n
// MYTaskArgument.h\n\n@interface MYTaskArgument : NSObject\n+ (instancetype) taskArgumentWithString:(NSString *)str;\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

执行:

\n\n
// MYTaskArgument.m\n\n@interface MYTaskArgument ()\n@property(copy) NSString *string;\n@end\n\n@implementation MYTaskArgument\n\n+ (instancetype) taskArgumentWithString:(NSString *)str {\n    MYTaskArgument *ret = [[MYTaskArgument alloc] init];\n    ret.string = str;\n    return ret;\n}\n\n- (const char *) fileSystemRepresentation {\n    return self.string.UTF8String;\n}\n\n- (id) forwardingTargetForSelector:(SEL)aSelector {\n    return self.string;\n}\n\n@end\n
Run Code Online (Sandbox Code Playgroud)\n