如何将整数转换为Unicode字符?

5
我想创建一个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];
}

我遇到了一个错误:"incomplete universal character name \u"。我想知道有没有更好的方法来构建一个Unicode符号数组?谢谢。

4个回答

7
您应该使用%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];
}

太好了,谢谢你提供这些。我使用了第一个,正是我所需要的。 - nevan king
主要的区别在于 %C 接受 wchar_t,它是一个(目前,在 Mac OS X 上)32 位的字符类型,因此你在这里传递的是 UTF-32。而 stringWithCharacters: 则接受 UTF-16。 - Peter Hosey

2
错误的原因是在编译时,\u 后必须紧跟着四个十六进制数字。你在后面添加了“%04x”,显然是想在运行时插入这四个十六进制数字,但这太晚了——编译器早已完成了它的工作,而编译器正是给你报错的原因。请保留HTML标签。

1
如果您想要一个单一的UTF-16字符,可以使用[NSString stringWithCharacters:&character length:1]。如果是UTF-32,则需要转换为代理对,或使用-initWithData:encoding:,或尝试Philippe所说的方法(我不确定它是否正确处理UTF-32,但应该可以)。

0

又一个糟糕的正则表达式使用示例:

需要 RegexKitLite。使用正则表达式(?s)。将一串Unicode字符拆分为NSArray.正则表达式运算符默认匹配除换行符以外的所有内容,序列(?s)表示打开Dot All正则选项,允许.匹配换行符。这很重要,因为在下面的示例中,我们显然至少跨越了\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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接