带有samba路径的NSFileManager contentsOfDirectoryAtPath编码问题

时间:2010-11-06 10:47:58

标签: cocoa encoding samba nsfilemanager

我使用此代码安装SMB路径

urlStringOfVolumeToMount = [urlStringOfVolumeToMount stringByAddingPercentEscapesUsingEncoding:NSMacOSRomanStringEncoding];
NSURL *urlOfVolumeToMount = [NSURL URLWithString:urlStringOfVolumeToMount];
FSVolumeRefNum returnRefNum;
FSMountServerVolumeSync( (CFURLRef)urlOfVolumeToMount, NULL, NULL, NULL, &returnRefNum, 0L);

然后,我得到了一些路径的内容:

NSMutableArray *content = (NSMutableArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];

我的问题是包含特殊字符的“content”数组中的每个路径(例如ü)给我编码2个字符:ü变成u¨

当我使用:

记录字节时
[contentItem dataUsingEncoding:NSUTF8StringEncoding];
它给了我:75cc88,你是(75)和¨(cc88)

我期望的是utf-8编码的ü字符。以字节为单位,应为c3bc

我尝试使用ISOLatin1编码转换我的路径,MacOSRoman ...但只要内容路径已经有2个单独的字符而不是ü,任何转换都会给我2个字符编码...

如果有人可以提供帮助,谢谢

我的配置:使用法国本地化并使用雪豹。

2 个答案:

答案 0 :(得分:0)

urlStringOfVolumeToMount = [urlStringOfVolumeToMount stringByAddingPercentEscapesUsingEncoding:NSMacOSRomanStringEncoding];

除非您出于某种原因特别需要MacRoman,否则您应该在这里使用UTF-8。

NSMutableArray *content = (NSMutableArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];
     

我的问题是包含特殊字符的“content”数组中的每个路径(例如ü)给我编码2个字符:ü变成u¨

你期待组合字符和分解序列。

由于您从文件系统获取路径名,这不是问题:路径名是正确的,因为您正在接收它们,并且只要您将它们传递给正确执行Unicode的路径,它们就会显示也正确。

答案 1 :(得分:0)

嗯,四年后我在同样的事情上挣扎,但在我的情况下åäö 花了很多时间才找到简单的解决方案。

NSString内置了必要的比较器。

aStringanotherString进行比较,其中一个来自NSFileManagers contentsOfDirectoryAtPath:返回的数组,其简单如下:
if( [aString compare:anotherString] == NSOrderedSame )

compare方法负责将两个字符串转换为可比较的规范格式。实际上使它们“如果看起来一样,它们是相同的”