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

时间:2013-08-27 07:41:12

标签: objective-c macos cocoa unicode nstask

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

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

我需要使用组合表单对NSTask个参数进行编码。我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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