Как я могу сделать символы Юникода из целых чисел?

Я хочу создать массив символов Unicode, но не знаю, как преобразовать целые числа в представление Unicode. Вот код, который у меня есть до сих пор

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0];
int i;

for (i = 32; i < 300; i++) {
    NSString *uniString = [NSString stringWithFormat:@"\u%04X", i];
    [uniArray addObject:uniString];
}

Что дает мне ошибку "неполное универсальное имя символа \u"

Есть ли лучший способ построить массив символов Unicode? Спасибо.


person nevan king    schedule 22.07.2009    source источник


Ответы (4)


Вы должны использовать %C для вставки символа Юникода:

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0];
int i;

for (i = 32; i < 300; i++) {
   NSString *uniString = [NSString stringWithFormat:@"%C", i];
   [uniArray addObject:uniString];
}

Другой (лучший?) способ - использовать stringWithCharacters:

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0];
int i;

for (i = 32; i < 300; i++) {
   NSString *uniString = [NSString stringWithCharacters:(unichar *)&i length:1];
   [uniArray addObject:uniString];
}
person Philippe Leybaert    schedule 22.07.2009
comment
Отлично, спасибо за это. Я использовал первый, это было как раз то, что мне было нужно. - person nevan king; 22.07.2009
comment
Основное отличие состоит в том, что %C принимает wchar_t, который (в настоящее время и в Mac OS X) является 32-разрядным, поэтому вы передаете туда UTF-32. stringWithCharacters: принимает кодировку UTF-16. - person Peter Hosey; 22.07.2009

Причина ошибки в том, что за \u должны следовать четыре шестнадцатеричных цифры во время компиляции. Вы добавили к нему «%04x», по-видимому, с намерением вставить эти четыре шестнадцатеричных цифры во время выполнения, что слишком поздно — к тому времени компилятор уже давно закончил свою работу, и компилятор это то, что дает вам эту ошибку.

person Peter Hosey    schedule 22.07.2009

Если вам нужен один символ UTF-16, [NSString stringWithCharacters:&character length:1]. Если это UTF-32, вам придется преобразовать в суррогатные пары, или использовать -initWithData:encoding:, или попробовать то, что сказал Филипп (навскидку я не уверен, что этот дескриптор правильно использует UTF-32, но должен).

person Jens Ayton    schedule 22.07.2009

Еще один вопиющий пример использования регулярных выражений:

Требуется RegexKitLite. Использует регулярное выражение (?s). для разделения строки символов Юникода на NSArray. Оператор регулярного выражения . соответствует всем кроме символов новой строки по умолчанию, а последовательность (?s) говорит Turn on the Dot All regex option, что позволяет . также соответствовать символу новой строки. Важно, поскольку мы, очевидно, пропускаем по крайней мере \n в приведенном ниже примере.

#import <Foundation/Foundation.h>
#import "RegexKitLite.h"

// Compile with: gcc -std=gnu99 -o unicodeArray unicodeArray.m RegexKitLite.m -framework Foundation -licucore

int main(int argc, char *argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  unichar uc[1024];
  for(NSUInteger idx = 0UL; idx < 1024UL; idx++) { uc[idx] = (unichar)idx; }
  NSArray *unicharArray = [[NSString stringWithCharacters:uc length:1024UL] componentsMatchedByRegex:@"(?s)."];

  NSLog(@"array: %@", [unicharArray subarrayWithRange:NSMakeRange(32UL, (1024UL - 32UL))]);

  [pool release];
  return(0);
}
person johne    schedule 24.07.2009