5

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

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

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

4

1 回答 1

4

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

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

但是,如果NSTask对参数对象的类标识做任何事情,这可能会产生问题。目前我没有证据表明是这种情况——这种解决方法似乎很有效。

标题:

// MYTaskArgument.h

@interface MYTaskArgument : NSObject
+ (instancetype) taskArgumentWithString:(NSString *)str;
@end

执行:

// MYTaskArgument.m

@interface MYTaskArgument ()
@property(copy) NSString *string;
@end

@implementation MYTaskArgument

+ (instancetype) taskArgumentWithString:(NSString *)str {
    MYTaskArgument *ret = [[MYTaskArgument alloc] init];
    ret.string = str;
    return ret;
}

- (const char *) fileSystemRepresentation {
    return self.string.UTF8String;
}

- (id) forwardingTargetForSelector:(SEL)aSelector {
    return self.string;
}

@end
于 2013-08-27T07:57:30.320 回答