【问题标题】:How can I make unicode characters from integers?如何从整数中生成 unicode 字符?
【发布时间】:2010-11-12 21:33:30
【问题描述】:

我想创建一个 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 符号数组?谢谢。

【问题讨论】:

    标签: objective-c cocoa string unicode nsstring


    【解决方案1】:

    正则表达式使用的另一个令人震惊的例子:

    需要RegexKitLite。使用正则表达式 (?s). 将一串 unicode 字符拆分为 NSArray. 正则表达式运算符默认匹配所有 but 换行符,序列 (?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);
    }
    

    【讨论】:

      【解决方案2】:

      错误原因是\u 后面必须跟四个十六进制数字在编译时。您在后面加上“%04x”,显然是为了在运行时插入这四个十六进制数字,这已经太晚了——编译器早就完成了它的工作,并且编译器是什么给你这个错误。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 太好了,谢谢这些。我用的是第一个,正是我需要的。
        • 主要区别在于%C 采用wchar_t,它(当前,在Mac OS X 上)是32 位的,所以你在那里传递UTF-32。 stringWithCharacters: 采用 UTF-16。
        【解决方案4】:

        如果你想要一个 UTF-16 字符,[NSString stringWithCharacters:&amp;character length:1]。如果是 UTF-32,则必须转换为代理对,或使用 -initWithData:encoding:,或尝试 Philippe 所说的(我不确定该句柄是否正确使用 UTF-32,但应该如此)。

        【讨论】:

          猜你喜欢
          • 2014-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-26
          • 1970-01-01
          • 2012-02-08
          • 1970-01-01
          • 2016-01-29
          相关资源
          最近更新 更多