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];
}

「不完全なユニバーサル文字名\u」というエラーが表示されます

Unicode シンボルの配列を作成するより良い方法はありますか? ありがとう。

4

4 に答える 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];
}
于 2009-07-22T06:35:54.017 に答える
2

エラーの理由は、コンパイル時に\u4桁の16進数を続ける必要があるためです。その後に「<code>%04x」を付けましたが、これは明らかに実行時にこれらの4桁の16進数を挿入することを目的としており、遅すぎます。コンパイラはそれまでに作業を終了しており、コンパイラはこのエラーが発生します。

于 2009-07-22T14:43:30.297 に答える
1

単一の UTF-16 文字が必要な場合は、[NSString stringWithCharacters:&character length:1]. UTF-32 の場合は、サロゲート ペアに変換するか、 を使用する-initWithData:encoding:か、Philippe が言ったことを試す必要があります (そのハンドルが UTF-32 で適切かどうかはわかりませんが、そうするべきです)。

于 2009-07-22T07:10:04.913 に答える
0

正規表現の使用法のさらに別の悪質な例:

RegexKitLiteが必要です。正規表現(?s).を使用して、Unicode 文字の文字列を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);
}
于 2009-07-24T05:36:33.537 に答える