Я искал, но удивительно не мог найти ответ.
У меня есть длинное 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. Существует ли лучший способ сделать это? У кого-либо есть хорошая категория для этого?
На самом деле часть про "безопасность 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 "глифа". Если вам абсолютно необходимо иметь длину меньше указанной, вам нужно проверить это.
Это кажется немного деликатным (сбой, если строка короче максимальной длины)
Тогда почему бы не исправить эту часть?
NSRange stringRange = {0, MIN([myString length], 20)};
Можно использовать тернарную операцию:
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];
Все операции с NSString безопасны для Юникода, поскольку NSString по сути представляет собой массив без кодировки. Даже если строка имеет другую кодировку, при отображении она преобразуется в указанную вами кодировку.