К сожалению, ответ Дейва на самом деле не делает то, что вы хотите. Индекс, предоставленный для rangeOfComposedCharacterSequenceAtIndex
, является индексом единицы кода UTF-16, 1 или 2 или которая составляет кодовую точку UTF-16. Таким образом, 1
не является второй кодовой точкой UTF-16, если первая кодовая точка в строке требует 2 кодовых единицы ... (rangeOfComposedCharacterSequenceAtIndex
возвращает диапазон кодовой точки, который включает кодовую единицу в данном индексе, поэтому если вашему первому символу требуется 2 единицы кода, то передача индекса 0 или 1 возвращает тот же диапазон).
Если вы хотите найти последовательность UTF-8 для символа, вы можете использовать UTF8String
, а затем проанализировать результирующие байты, чтобы найти последовательность байтов для n-го символа. Или вы также можете использовать rangeOfComposedCharacterSequenceAtIndex
, начиная с индекса 0 и повторять до достижения n-го символа, а затем преобразовать 1 или 2 единицы кода UTF-16 в единицы кода UTF-8.
Я надеюсь, что мы все что-то упустили, и это встроено ...
Начало (требуется проверка границ!) Категории, которая может помочь:
@interface NSString (UTF)
- (NSRange) rangeOfUTFCodePoint:(NSUInteger)number;
@end
@implementation NSString (UTF)
- (NSRange) rangeOfUTFCodePoint:(NSUInteger)number
{
NSUInteger codeUnit = 0;
NSRange result;
for(NSUInteger ix = 0; ix <= number; ix++)
{
result = [self rangeOfComposedCharacterSequenceAtIndex:codeUnit];
codeUnit += result.length;
}
return result;
}
@end
но такого рода вещи более эффективны при использовании char *
, а не NSString