我正在为Mac OS X(10.5)编写一个CLI-Tool,它必须处理很可能包含非ASCII字符的命令行参数.
为了进一步处理,我使用[NSString stringWithCString:encoding:]转换这些参数.
我的问题是,我找不到关于如何确定运行所述cli-tool的shell使用的字符编码的好信息.
我想出的解决方案如下:
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
NSString *ianaName = [[environment objectForKey:@"LANG"] pathExtension];
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(
CFStringConvertIANACharSetNameToEncoding( (CFStringRef)ianaName ) );
NSString *someArgument = [NSString stringWithCString:argv[someIndex] encoding:encoding];
然而,我觉得有点粗糙 – 这让我觉得我错过了一些明显的东西……但是什么呢?
是否有更健全/更清洁的方式实现基本相同?
提前致谢
d
最佳答案 答案取决于非asciiness的来源.
>在OS X中,环境变量LANG不反映GUI中语言的选择.很少有人会在命令行设置LANG.
> GUI上“系统编码”的选择存储在〜/ .CFUserTextEncoding中,可以通过CFStringGetSystemEncoding获得,参见Apple doc.
>也就是说,这种“系统编码”很少使用,除非是非常旧的非unicode感知软件.任何理智的Cocoa程序只使用Unicode而不使用其他任何东西.
>特别是,Cocoa级别的文件路径始终以(UTF-8的变体)编码.因此,要从C字符串获取NSString,请使用
NSString*string=[NSString stirngWithCString:cString encoding:NSUTF8Encoding];
并从NSString获取文件路径的C字符串,使用
char*path=[string fileSystemRepresentation];
这里建议不要只使用[string UTF8String],由于其细微之处,请参阅此Apple doc.
>所以,我建议你不要关心编码,只假设是UTF-8.
>也就是说,可能只有极少数人在命令行上设置LANG,你可能想要照顾它们.然后,你所做的就是我能想出的唯一一件事.