Как преобразовать файлы с обычным текстом (.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
- Terminal -I выходы:
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];
Это приводит меня несколько вопросов:
- Есть не универсальный способ преобразования содержимого текстового файла Plain, независимо от кодировки, в строке (т.е. наименьший общий знаменатель)? Я считаю, что раньше была цель
initWithContentsOfFile
, которая, к сожалению, теперь устарела. ASCIStringEncoding не работает. - Есть ли что-нибудь о преобразовании закодированного NSUTF16 файла в строку, которую мне нужно будет обрабатывать иначе, чем если бы это был NSUTF8?
Предполагая, что файл на самом деле 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]; }}
Опираясь на 'txtFileAsString', используя nu для недействительных кодировок, не гарантируется. Вы пробовали ответ от @Rob? – zaph
CP437 всегда действителен, даже если он неверен. –