2015-07-15 6 views
4

Как преобразовать файлы с обычным текстом (.txt) в строку, если тип кодировки неизвестен?Преобразование файла TXT неизвестной кодировки в строку

Я работаю над функцией, которая позволит пользователям импортировать txt-файлы в мое приложение. Это означает, что файл можно было создать в любом количестве приложений, используя любой из множества кодировок, которые считаются действительными для обычного текстового файла. Я понимаю, что это может включать в себя (ASCII, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE или EBCDIC ?!)

Вещи шли скважина, используя следующее:

NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&errorReading]; 

Затем пользователь предоставил файл, который привел к пустым содержимым при импорте. Я просмотрел файл в XCode debug и увидел ошибку Cocoa 261, NSStringEncoding = 4.

То, что я знаю:

  • Прилагаемый файл пользователя был создан с приложением называется knowtes открывает
  • Файл с TextEdit, TextWranger и т.д. на Mac OS X
  • Файл содержит «специальный символы», такие как умляуты (декламация: почему не„у“на умляуте есть умляут ?!)
  • Finder информация отображается:

Kind: text

text/plain; charset=utf-16le

Я предполагаю, что UTF-16LE кодирование файла является ключевым, так как я ожидал файл NSUTF8. Я попытался использовать ASCII как самый низкий общий знаменатель. Это не сбой, а подталкивание некоторыми персонажами, которых нет в исходном файле.

NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&errorReading]; 

Таким образом, я попытался преобразовать файл NSData первым, надеясь, что это может свести на нет необходимость признать кодировку. Это не работает.

NSData *txtFileData = [NSData dataWithContentsOfFile:path]; 
    NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSUTF8StringEncoding]; 

Это приводит меня несколько вопросов:

  1. Есть не универсальный способ преобразования содержимого текстового файла Plain, независимо от кодировки, в строке (т.е. наименьший общий знаменатель)? Я считаю, что раньше была цель initWithContentsOfFile, которая, к сожалению, теперь устарела. ASCIStringEncoding не работает.
  2. Есть ли что-нибудь о преобразовании закодированного NSUTF16 файла в строку, которую мне нужно будет обрабатывать иначе, чем если бы это был NSUTF8?
  3. Предполагая, что файл на самом деле URF16LE, почему следующие suggestion не работают?

    NSString *txtFileAsString = nil; 
    if (path !=nil) { 
        NSData *txtFileData = [NSData dataWithContentsOfFile:path]; 
        NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSASCIIStringEncoding]; 
    if (!txtFileAsString) { 
        txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF8StringEncoding]; 
    } 
    if (!txtFileAsString) { 
        txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16StringEncoding]; 
    } 
    if (!txtFileAsString) { 
        txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16LittleEndianStringEncoding]; 
    } 
    if (!txtFileAsString) { 
        txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16BigEndianStringEncoding]; 
    } 
    if (!txtFileAsString) { 
        txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32StringEncoding]; 
    } 
    if (!txtFileAsString) { 
        txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32LittleEndianStringEncoding]; 
    } 
    if (!txtFileAsString) { 
        txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32BigEndianStringEncoding]; 
    }} 
    
+0

Опираясь на 'txtFileAsString', используя nu для недействительных кодировок, не гарантируется. Вы пробовали ответ от @Rob? – zaph

+0

CP437 всегда действителен, даже если он неверен. –

ответ

3

Иногда stringWithContentsOfFile:usedEncoding:error: может выполнять работу (особенно если файл имеет Byte Order Mark):

NSError *error; 
NSStringEncoding encoding; 
NSString *string = [NSString stringWithContentsOfFile:path usedEncoding:&encoding error:&error]; 

Заметим, что это исполнение с usedEncoding не следует путать с аналогичным названием метода, который только имеет параметр encoding.

+0

Звездный! Кажется, это так просто, когда вы так выразились. : P Почему в heck не XCode ссылается на этот метод в выражении устаревания для initWithContentsOfFile ?! – DenVog

+0

Это * is * в документации 'NSString':' + (instancetype nullable) stringWithContentsOfFile: (NSString * nonnull) path usedEncoding: (NSStringEncoding * nullable) enc error: (NSError * nullable * nullable) error' "По возвращении if файл читается успешно, содержит кодировку, используемую для интерпретации файла по пути ». Если у вас возникли проблемы с поиском в документации Apple, рассмотрите возможность использования приложения Dash, это та же самая документация Apple, более удобная. – zaph

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