如何从CFFTPCreateParsedResourceListing函数重新编码数据?

时间:2016-07-29 01:59:38

标签: ios objective-c iphone

我尝试使用CFNetwork.framework与FTP服务器通信。

使用CFFTP API(CFWriteStreamCreateWithFTPURL函数),我得到一个特定URL的NSData。

然后我开始用CFFTPCreateParsedResourceListing函数解析NSData,它给我编码很差的文件名。(当文件名是韩文时) 韩语中的所有字符都转换为问号(?)。

我该如何解决这个问题?请给我一些建议。提前谢谢你。

NSMutableArray *    newEntries;
NSUInteger          offset;

newEntries = [NSMutableArray array];
assert(newEntries != nil);

offset = 0;
do {
    CFIndex         bytesConsumed;
    CFDictionaryRef thisEntry;

    thisEntry = NULL;

    assert(offset <= [self.listData length]);
    bytesConsumed = CFFTPCreateParsedResourceListing(NULL, &((const uint8_t *) self.listData.bytes)[offset], (CFIndex) ([self.listData length] - offset), &thisEntry);
    if (bytesConsumed > 0) {

        if (thisEntry != NULL) {
            NSDictionary *  entryToAdd;

            entryToAdd = [self entryByReencodingNameInEntry:(__bridge NSDictionary *) thisEntry encoding:NSUTF8StringEncoding];

            [newEntries addObject:entryToAdd];
        }


        offset += (NSUInteger) bytesConsumed;
    }

    if (thisEntry != NULL) {
        CFRelease(thisEntry);
    }

    if (bytesConsumed == 0) {

        break;
    } else if (bytesConsumed < 0) {

        [self stopReceiveWithStatus:@"Listing parse failed"];
        break;
    }
} while (YES);
代码下面的

是entryByReencodingNameInEntry方法

NSDictionary *  result;
NSString *      name;
NSData *        nameData;
NSString *      newName;

newName = nil;

// Try to get the name, convert it back to MacRoman, and then reconvert it
// with the preferred encoding.

name = [entry objectForKey:(id) kCFFTPResourceName];
if (name != nil) {
    assert([name isKindOfClass:[NSString class]]);

    nameData = [name dataUsingEncoding:NSMacOSRomanStringEncoding];
    if (nameData != nil) {
        newName = [[NSString alloc] initWithData:nameData encoding:newEncoding];
    }
}

if (newName == nil) {
    assert(NO);                 // in the debug builds, if this fails, we should investigate why
    result = (NSDictionary *) entry;
} else {
    NSMutableDictionary *   newEntry;

    newEntry = [entry mutableCopy];
    assert(newEntry != nil);

    [newEntry setObject:newName forKey:(id) kCFFTPResourceName];

    result = newEntry;
}

return result;
例如,

如果一个文件夹有3个文件 애플.txt,삼성.txt,테스트.txt - &gt;转换为?? .txt,??。txt,???。txt

0 个答案:

没有答案