Строки чтения от и пишущие строки к файлам и 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 позволяет пользователю вновь открывать файл с явно указанным кодированием.
Если Вы вынуждены предположить кодирование (и отметить, что в отсутствие явной информации, это - предположение):
Попробовать
stringWithContentsOfFile:usedEncoding:error:
илиinitWithContentsOfFile:usedEncoding:error:
(или ОСНОВАННЫЕ НА URL эквиваленты).Эти методы пытаются определить кодирование ресурса, и если успешный возврат ссылкой используемое кодирование.
Если (1) сбои, попытайтесь считать ресурс путем указания UTF-8 как кодирование.
Если (2) сбои, попробуйте надлежащее устаревшее кодирование.
«Надлежащий» здесь зависит немного от обстоятельств; это могло бы быть кодирование струны до по умолчанию, это мог бы быть ISO или Windows Latin 1 или что-то еще, в зависимости от того, куда Ваши данные прибывают из.
Наконец, можно попробовать
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:
Источник | Метод создания | Метод экстракции |
---|---|---|
Содержание URL | ||
Содержание файла |