Некоторые символы были изменены в NSString

Я извлекаю строку из содержимого url, таким образом:

NSString *urlStr = [NSString stringWithFormat:@"http://www.example.com/string_to_retrieve"];
NSURL *url = [NSURL URLWithString:urlStr];
NSString *resp = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:nil];

и записать его в файл, таким образом:

NSString *outFile = @"/path/to/myfile";
[resp writeToFile:outFile atomically:YES encoding:NSUTF8StringEncoding error:nil];

моя строка содержит несколько специальных символов, таких как "ö", которые должны быть представлены шестнадцатеричным значением "F6", но когда я пытаюсь открыть с шестнадцатеричным редактором файл, где написана моя строка, я вижу, что "ö" (F6 ) преобразуется в два других символа: "ö" (C3 B6)

Я попытался с несколькими другими строковыми кодировками в обоих

NSString *resp = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:nil];

и

[resp writeToFile:outFile atomically:YES encoding:NSUTF8StringEncoding error:nil];

но всегда с плохими результатами...

NSASCIIStringEncoding кажется единственным способом, которым я могу получить эту строку из моего url: если я использую другие кодировки типа NSUTF8StringEncoding, все, что я получаю, это nil

NSUTF8StringEncoding кажется единственным способом, который я могу записать в свой файл: если я использую другие кодировки типа NSASCIIStringEncoding, все, что я получаю, это файл с 0 байтами

Итак, как я могу правильно восстановить и записать эту строку в мой файл?

Ответ 1

F6 - это код символа "ö" в NSISOLatin1StringEncoding, поэтому

[resp writeToFile:outFile atomically:YES encoding:NSISOLatin1StringEncoding error:nil];

должен дать желаемый результат. (NSISOLatin2StringEncoding работает также. Я не уверен в различиях. Документация поддерживаемых кодировок не очень многословна.)


Update:

  • NSISOLatin1StringEncoding - это ISO-8859-1 кодировка, предназначенная для "западноевропейских" языков.
  • NSISOLatin2StringEncoding - это ISO-8859-2 кодировка, которая предназначена для "восточноевропейских" языков.
  • @Esailija заявляет (см. комментарии ниже), что Windows-1252 может быть лучшим выбором, соответствующая кодировка - NSWindowsCP1252StringEncoding.