Некоторые символы были изменены в 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.