-1

大家好,我从互联网下载文件时遇到问题,我需要从中挖掘一些数据。我打开它并尝试缓冲它,但它给了我错误的字符,因为这个文件是捷克语......我的代码:

- (void) sync {

    NSString * path = @"/Users/syky/Documents/stats.csv";
    NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
    NSData * buffer = nil;
    while ((buffer = [fileHandle readDataOfLength:1024])) {
    //do something with the buffer

    NSString * s = [[NSString alloc]initWithData:buffer encoding:nil];
    NSLog(s);
    break;

}

无论我选择哪种编码,我总是会得到损坏的字符,例如

"Poø.";"Jméno"

我需要得到:

"Příjmení";"Jméno"

此文件最初由 Microsoft Excel 生成,例如 *.csv 导出文件...当我尝试通过任何 MAC OS X 文本编辑器打开此文件时,我也会收到损坏的字符,但是当我在其他基于 Windows 的机器上打开它时Microsoft Excel 它工作得很好...

谢谢您的帮助

解决方案:

- (void) sync {

    NSString * path = @"/Users/syky/Documents/stats.csv";
    NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
    NSData * buffer = nil;
    while ((buffer = [fileHandle readDataOfLength:1024])) {

    NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsLatin2);
    NSString *string = [[NSString alloc] initWithData:buffer encoding:encoding];

    NSLog(string);

    break;

}
4

1 回答 1

2

首先,我不会说捷克语。其次,我认为“使用 UTF-8”类似于说“向它扔桶”。它以同样的方式严厉。

根据我的研究,您可以使用 ISO Latin 2 或 Apple 的中欧罗马编码。你会发现前者在NSStringEncodings 中代表,但不是后者,因此请关注 Core Foundation 的支持:

NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingMacCentralEurRoman);
NSString *string = [[NSString alloc] initWithData:buffer encoding:encoding];

否则,您可以(并且可能已经有,根据您所说的)使用:

NSString *string = [[NSString alloc] initWithData:buffer encoding:NSISOLatin2StringEncoding];

我真的很想知道使用CFStringEncoding编码是否可以改善您的情况。

编辑:

如果您的源代码是由 Microsoft Excel 生成的,则可能kCFStringEncodingWindowsLatin2会代替kCFStringEncodingMacCentralEurRoman. 像以前一样,您需要使用 CFStringConvertEncodingToNSStringEncoding 对其进行转换。

您可能还想尝试另一种方法。既然CFStringRef是“收费桥”到NSString(和所以是CFDataRefNSData,也许完全在核心基金会工作可能会奏效:

CFStringRef stringRef = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, (CFDataRef)buffer, kCFStringEncodingMacCentralEurRoman);
NSString *string = (NSString *)stringRef;

在这种情况下,不要忘记stringRef必须释放。

祝你在你的努力中好运。

于 2013-07-10T22:10:05.053 回答