2013-07-10 3 views
-1

Привет всем У меня есть проблема при загрузке файла из Интернета, из которого мне нужно раздобыть некоторые данные. Я открываю его и попытаться буфера, но это дает мне неправильные символы, потому что этот файл находится в Чехии ... Мой код:Objective C read file неправильная кодировка

- (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; 

} 
+3

Вы передаете 'nil' для параметра' encoding'? В самом деле? – trudyscousin

+1

+ (id) stringWithContentsOfURL: (NSURL *) url usedEncoding: (NSStringEncoding *) enc error: (NSError **) error –

+0

@trudyscousin, если бы вы могли читать немного больше Я говорю: независимо от того, какую кодировку я выбираю, я всегда получаю сломанные символы, такие как ... С nil я получаю самый близкий результат !!! –

ответ

2

Во-первых, я не чешский динамик. Во-вторых, я думаю, что «использовать UTF-8» сродни тому, чтобы сказать «бросить в него бочку». Это так же тяжело.

Из того, что я исследовал, вы можете использовать ISO Latin 2 или классическую европейскую классическую кодировку Apple. Вы найдете бывший представлены среди NSStringEncoding с, но не последний, так что смотреть на поддержку основных фонда:

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

В противном случае, вы могли бы (и, возможно, уже есть, от того, что вы сказали) использовать:

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

Мне действительно интересно узнать, использует ли код CFStringEncoding кодировки, улучшает вашу ситуацию.

EDIT:

Если ваш источник был сгенерирован Microsoft Excel, возможно, kCFStringEncodingWindowsLatin2 будет работать вместо kCFStringEncodingMacCentralEurRoman. Как и раньше, вам нужно будет преобразовать его с помощью CFStringConvertEncodingToNSStringEncoding.

Есть еще один подход, который вы можете попробовать. Поскольку CFStringRef является «платным мостиком» к NSString (и так CFDataRef к NSData), возможно, работает полностью в Основном Фонде может работать:

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

В этом случае, не забывайте, что stringRef должен быть освобожден.

Удачи вам в ваших начинаниях.

+0

WOW, это не сработало. Но он сделал что-то ... «PoÝ.»; «Jmťno» Что-то совсем другое, чем я ожидал ... –

+0

@TomasSykora Aw, орехи. Но твоя проблема меня интересует, и я посмотрю, что еще я могу найти. Кодировка KOI-8 L2 упоминалась в моем чтении, но я не вижу, что Apple поддерживает ее. – trudyscousin

+0

Доступ к этому файлу можно получить по этой ссылке: http://www.baseball.cz/modules.php?op=modload&name=liga&file=index&do=statx&akce=219&pda=2&admina=op=modload&name=liga&file=index&pda=2&admina=&akce= 219 & do = statx & vypis = 1 & mode = Export + do + Excelu & xco = palka & xtyp = 0 & xzid = 0 –

Смежные вопросы