Строки чтения от и пишущие строки к файлам и URLs

Чтение файлов или использования URLs NSString является прямым при условии, что Вы знаете, какое кодирование использования ресурса — если Вы не знаете, кодирование, читая ресурс более сложно. Когда Вы пишете в файл или URL, необходимо указать кодирование для использования. (Где возможно, необходимо использовать URLs, потому что они более эффективны.)

Чтение от файлов и URLs

NSString обеспечивает множество методов для чтения данных из файлов и URLs. В целом, если Вы знаете его кодирование, намного проще считать данные. Если у Вас есть простой текст и никакое знание кодирования, Вы уже находитесь в трудной позиции. Необходимо избежать ставить себя в эту позицию, если вообще возможный — что-нибудь, что требует использование файлов простого текста, должно указать кодирование (предпочтительно UTF-8 или UTF-16+BOM).

Чтение данных с известным кодированием

Для чтения из файла или URL, для которого Вы знаете кодирование Вы используете stringWithContentsOfFile:encoding:error: или stringWithContentsOfURL:encoding:error:, или соответствие init... метод, как проиллюстрировано в следующем примере.

NSURL *URL = ...;
NSError *error;
NSString *stringFromFileAtURL = [[NSString alloc]
                                      initWithContentsOfURL:URL
                                      encoding:NSUTF8StringEncoding
                                      error:&error];
if (stringFromFileAtURL == nil) {
    // an error occurred
    NSLog(@"Error reading file at %@\n%@",
              URL, [error localizedFailureReason]);
    // implementation continues ...

Можно также инициализировать строку с помощью объекта данных, как проиллюстрировано в следующих примерах. Снова, необходимо указать корректное кодирование.

NSURL *URL = ...;
NSData *data = [NSData dataWithContentsOfURL:URL];
 
// Assuming data is in UTF8.
NSString *string = [NSString stringWithUTF8String:[data bytes]];
 
// if data is in another encoding, for example ISO-8859-1
NSString *string = [[NSString alloc]
            initWithData:data encoding: NSISOLatin1StringEncoding];

Чтение данных с неизвестным кодированием

Если Вы оказываетесь с текстом неизвестного кодирования, лучше удостоверяться, что существует механизм для исправления неизбежных ошибок. Например, Почта Apple и приложения Safari имеют меню кодирования, и TextEdit позволяет пользователю вновь открывать файл с явно указанным кодированием.

Если Вы вынуждены предположить кодирование (и отметить, что в отсутствие явной информации, это - предположение):

  1. Попробовать stringWithContentsOfFile:usedEncoding:error: или initWithContentsOfFile:usedEncoding:error: (или ОСНОВАННЫЕ НА URL эквиваленты).

    Эти методы пытаются определить кодирование ресурса, и если успешный возврат ссылкой используемое кодирование.

  2. Если (1) сбои, попытайтесь считать ресурс путем указания UTF-8 как кодирование.

  3. Если (2) сбои, попробуйте надлежащее устаревшее кодирование.

    «Надлежащий» здесь зависит немного от обстоятельств; это могло бы быть кодирование струны до по умолчанию, это мог бы быть ISO или Windows Latin 1 или что-то еще, в зависимости от того, куда Ваши данные прибывают из.

  4. Наконец, можно попробовать NSAttributedStringметоды загрузки от Набора Приложения (такой как initWithURL:options:documentAttributes:error:).

    Эти методы пытаются загрузить файлы простого текста и возвратить используемое кодирование. Если Ваше приложение не имеет никаких специальных экспертных знаний в тексте, они могут использоваться на более или менее произвольных текстовых документах и достойны рассмотрения. Они не могли бы быть столь же подходящими для инструментов Уровня основы или документов, которые не являются текстом естественного языка.

Запись в файлы и URLs

По сравнению с чтением данных из файла или URL, запись является прямой —NSString обеспечивает два удобных метода, writeToFile:atomically:encoding:error: и writeToURL:atomically:encoding:error:. Необходимо указать кодирование, которое должно использоваться и выбрать, записать ли ресурс атомарно или нет. Если Вы не принимаете решение записать атомарно, строка записана непосредственно в путь, который Вы указываете. Если Вы принимаете решение записать его атомарно, это записано сначала во вспомогательный файл, и затем вспомогательный файл переименован к пути. Эта опция гарантирует, что файл, если это существует вообще, не будет поврежден, даже если система должна отказать во время записи. Если Вы пишете в URL, опция атомарности проигнорирована, если место назначения не имеет типа, к которому можно получить доступ атомарно.

NSURL *URL = ...;
NSString *string = ...;
NSError *error;
BOOL ok = [string writeToURL:URL atomically:YES
                  encoding:NSUnicodeStringEncoding error:&error];
if (!ok) {
    // an error occurred
    NSLog(@"Error writing file at %@\n%@",
              path, [error localizedFailureReason]);
    // implementation continues ...

Сводка

Эта таблица суммирует наиболее распространенные средние значения чтения и записи, что строка возражает против и от файлов и URLs: