Как мога да направя уникод символи от цели числа?

Искам да направя масив от 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

Още един впечатляващ пример за използване на Regex:

Изисква 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