Как я могу усечь NSString к длине набора?

Я искал, но удивительно не мог найти ответ.

У меня есть длинное NSString то, что я хочу сократиться. Я хочу, чтобы максимальная длина была приблизительно 20 символами. Я считал где-нибудь, что лучшее решение состоит в том, чтобы использовать substringWithRange. Действительно ли это - лучший способ усечь строку?

NSRange stringRange = {0,20};
NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
NSString *shortString = [myString substringWithRange:stringRange];

Это кажется немного тонким (катастрофические отказы, если строка короче, чем максимальная длина). Я также не уверен, безопасно ли это от Unicode. Существует ли лучший способ сделать это? У кого-либо есть хорошая категория для этого?

65
задан nevan king 1 June 2010 в 18:33
поделиться

4 ответа

На самом деле часть про "безопасность Unicode" была правильной, так как многие символы сочетаются в Unicode, что не учитывается в предложенных ответах.

Например, если вы хотите напечатать é. Один из способов сделать это - набрать "e"(0x65)+комбинированное ударение "́"(0x301). Теперь, если вы наберете "café" таким образом и усечете 4 символа, вы получите "cafe". Это может вызвать проблемы в некоторых местах.

Если вас это не волнует, другие ответы работают нормально. В противном случае сделайте следующее:

// define the range you're interested in
NSRange stringRange = {0, MIN([myString length], 20)};

// adjust the range to include dependent chars
stringRange = [myString rangeOfComposedCharacterSequencesForRange:stringRange];

// Now you can create the short string
NSString *shortString = [myString substringWithRange:stringRange];

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

120
ответ дан 24 November 2019 в 15:17
поделиться

Это кажется немного деликатным (сбой, если строка короче максимальной длины)

Тогда почему бы не исправить эту часть?

NSRange stringRange = {0, MIN([myString length], 20)};
7
ответ дан 24 November 2019 в 15:17
поделиться

Можно использовать тернарную операцию:

NSString *shortString = (stringRange.length <= [myString length]) ? myString : [myString substringWithRange:stringRange];

Или для большего контроля над конечным результатом:

if (stringRange.length > [myString length])
    // throw exception, ignore error, or set shortString to myString
else 
    shortString = [myString substringWithRange:stringRange];
3
ответ дан 24 November 2019 в 15:17
поделиться

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

0
ответ дан 24 November 2019 в 15:17
поделиться