Как я могу сделать символы Юникода из целых чисел? - PullRequest
5 голосов
/ 22 июля 2009

Я хочу создать массив символов 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? Спасибо.

Ответы [ 4 ]

7 голосов
/ 22 июля 2009

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

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];
}
2 голосов
/ 22 июля 2009

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

1 голос
/ 22 июля 2009

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

0 голосов
/ 24 июля 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);
}
...