На самом деле часть о том, чтобы быть «безопасным для Юникода», уже устарела, так как многие символы объединяются в Юникоде, что в предложенных ответах не учитывается.
Например, если вы хотите ввести é. Один из способов сделать это - набрать «е» (0x65) + сочетание акцента «́» (0x301). Теперь, если вы наберете «кафе» и урежете 4 символа, вы получите «кафе». Это может вызвать проблемы в некоторых местах.
Если вас это не волнует, другие ответы работают нормально. В противном случае сделайте это:
// 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 «глифа». Если вам абсолютно необходимо, чтобы длина была меньше указанной вами, вам необходимо проверить это.