Преобразовать 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 и вижу ошибку Какао 261, NSStringEncoding = 4.

Что я знаю:

Предоставленный пользователем файл был создан с помощью приложения под названием KnowtesФайл открывается с помощью TextEdit, TextWranger и т. Д. В Mac OS XФайл содержит «специальные символы», такие как умляуты (rant: почему у умлаута «u» нет умлаута ?!)Finder Info отображает:

Вид: текст

Терминал -I выходы:

текст / равнина; кодировка = 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];

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

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

Предполагая, что файл на самом деле URF16LE, почему следующеепредложение тоже не работает?

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];
}}

Ответы на вопрос(1)

Ваш ответ на вопрос