Слова, абзацы и разрывы строки

Эта статья описывает, как слово и границы абзаца определяются, как представлены разрывы строки, и как можно разделить строку абзацем.

Word Boundaries

Текстовая система определяет границы слова специфичным для языка способом согласно Приложению № 29 Стандарта Unicode с дополнительной настройкой для локали, как описано в том документе. На OS X Какао представляет APIs, связанный с границами слова, такой как NSAttributedString методы doubleClickAtIndex: и nextWordFromIndex:forward:, но Вы не можете изменить способ, которым работают сами граничные словом алгоритмы.

Строка и символы разделителя абзацев

Существует много путей, которыми могут быть представлены разрыв строки или конец абзаца. Исторически, \n, \r, и \r\n использовались. Unicode определяет однозначный разделитель абзацев, U+2029 (для которого Какао обеспечивает константу NSParagraphSeparatorCharacter), и однозначный разделитель строки, U+2028 (для которого Какао обеспечивает константу NSLineSeparatorCharacter).

В текстовой системе Какао, NSParagraphSeparatorCharacter последовательно обрабатывается как конец абзаца, и NSLineSeparatorCharacter последовательно обрабатывается как разрыв строки, который не является концом абзаца — т.е. разрыв строки в абзаце. Однако в других контекстах, существует немного гарантий относительно того, как будут обработаны эти символы. Программное обеспечение уровня POSIX, например, часто распознает только \n как повреждение. Некоторое более старое программное обеспечение Macintosh распознает только \r, и некоторое программное обеспечение Windows распознает только \r\n. Часто нет никакого различия между разрывами строки и концами абзаца.

Какой символ разрыва строки или конца абзаца, который необходимо использовать, зависит от того, как данные могут использоваться и от какой платформы. Текстовая система Какао распознает \n, \r, или \r\n все как концы абзаца — эквивалентный NSParagraphSeparatorCharacter. Когда это вставляет концы абзаца, например с insertNewline:, это использует \n. Обычно NSLineSeparatorCharacter используется только для повреждений, которые являются в частности разрывами строки и не концами абзаца, например в insertLineBreak:, или для представления HTML <br> элементы.

Если Ваши повреждения в частности предназначаются как разрывы строки и не концы абзаца, то необходимо обычно использовать NSLineSeparatorCharacter. Иначе, можно использовать \n, \r, или \r\n в зависимости от какого другое программное обеспечение, вероятно, обработает Ваш текст. Выбор по умолчанию для Какао обычно \n.

Разделение строки “абзацем”

Общий подход к разделению строки “абзацем” должен просто использовать:

NSArray *arr = [myString componentsSeparatedByString:@"\n"];

Это, однако, игнорирует факт, что существует много других путей, которыми конец абзаца или разрыв строки могут быть представлены в строке —\r, \r\n, или разделители Unicode. Вместо этого можно использовать методы — такой как lineRangeForRange: или getParagraphStart:end:contentsEnd:forRange:— это принимает во внимание разнообразие возможных линейных окончаний, как проиллюстрировано в следующем примере.

NSString *string = /* assume this exists */;
unsigned length = [string length];
unsigned paraStart = 0, paraEnd = 0, contentsEnd = 0;
NSMutableArray *array = [NSMutableArray array];
NSRange currentRange;
while (paraEnd < length) {
    [string getParagraphStart:&paraStart end:&paraEnd
    contentsEnd:&contentsEnd forRange:NSMakeRange(paraEnd, 0)];
    currentRange = NSMakeRange(paraStart, contentsEnd - paraStart);
    [array addObject:[string substringWithRange:currentRange]];
}