Считать символ UTF8 в указанной позиции из строки NSString - PullRequest
8 голосов
/ 24 февраля 2011

    NSString* str = @"1二3四5";
    NSLog(@"%c",[str characterAtIndex:0]); 
    NSLog(@"%c",[str characterAtIndex:1]);  

NSString - CharacterAtIndex хорошо работает на ASCII-символах, но как я могу получить символ UTF8 с индексом 2?

- обновлено -
Кажется, unichar (16 бит) не может представлять все строки кодирования UTF8 (от 8 до 32 бит), поэтому есть ли способ получить символ из NSString?

Ответы [ 3 ]

6 голосов
/ 24 февраля 2011

К сожалению, ответ Дейва на самом деле не делает то, что вы хотите. Индекс, предоставленный для 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

4 голосов
/ 24 февраля 2011

Вы бы использовали более подробные методы:

NSRange rangeOfSecondCharacter = [str rangeOfComposedCharacterSequenceAtIndex:1];
NSString *secondCharacter = [str substringWithRange:rangeOfSecondCharacter];

... с правильными границами и проверкой диапазона, конечно.Обратите внимание, что это дает вам NSString , объект, а не unichar или какой-либо другой примитивный тип данных.

0 голосов
/ 04 августа 2014

Почему бы вам не попробовать использовать что-то подобное:

const char *yourWantedCharacter = [[yourSourceString substringWithRange:yourRange] UTF8String];

где yourSourceString - это ваш объект NSString, yourRange - это объект NSRange с индексом необходимого символа в качестве параметра местоположения и параметром длины '0' (ноль).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...