Я предполагаю, что:
- Вы читаете этот RTF данные из файла или другого внешнего источника.
- Вы сами разбираете его (не используя, скажем, встроенный RTF-анализатор AppKit).
- У вас есть причина, по которой вы разбираете ее самостоятельно, и эта причина не «ждать, у AppKit есть это встроенное?».
- Вы столкнулись с
\u…
на входе, которое вы обрабатываете, и его необходимо преобразовать в символ для дальнейшей обработки и/или включения в выходной текст.
- Вы исключили
\uc
, что совсем другое (оно указывает количество байтов, не относящихся к Юникоду, которые следуют за последовательностью \u…
, если я правильно понял спецификацию RTF).
\u
следует за шестнадцатеричными цифрами. Вам нужно разобрать их на число; это число является номером кодовой строки Юникода для символа, который представляет последовательность. Затем вам нужно создать NSString, содержащий этот символ.
Если вы используете NSScanner для синтаксического анализа ввода, то (при условии, что вы уже просмотрели \u
), вы можете просто спросить сканер scanHexInt:
. Передайте указатель на переменную unsigned int
.
Если вы не используете NSScanner, делайте то, что имеет смысл, поскольку вы его разбираете. Например, если вы преобразовали данные RTF в строку C и читаете ее самостоятельно, вы должны будете использовать strtoul
для разбора шестнадцатеричного номера. Он будет интерпретировать номер в любой базе, которую вы указали (в данном случае, 16), а затем поместите указатель на следующий символ, где хотите.
В переменной unsigned int
или unsigned long
переменная будет содержать значение кодовой точки Юникода для указанного символа. В примере с вашего вопроса будет 0x10003
или U + 10003.
Теперь для большинства символов вы можете просто назначить это переменной unichar
и создать из нее NSString. Это не сработает здесь: unichar
s только до 0xFFFF
, и эта кодовая точка выше, чем это (в технических терминах это вне базовой многоязычной плоскости).
К счастью, * CF * Строка имеет функцию, чтобы помочь вам:
unsigned int codePoint = /*…*/;
unichar characters[2];
NSUInteger numCharacters = 0;
if (CFStringGetSurrogatePairForLongCharacter(codePoint, characters)) {
numCharacters = 2;
} else {
characters[0] = codePoint;
numCharacters = 1;
}
Вы можете использовать stringWithCharacters:length:
создать NSString из этого массива 16-битных символов.
Вы сделали Google ..? вот один asnwer [Преобразование символа Unicode в NSString] (http://stackoverflow.com/questions/12090585/convert-unicode-character-to-nsstring) –
Извините, я не могу ничего получить в Google для этого. Большинство из них имеют четырехзначное число, здесь у нас есть пять номеров. – boom
Это [RTF] (http://en.wikipedia.org/wiki/Rich_Text_Format). Что именно вы хотите с этим сделать? –