西海岸より

つらつらざつざつと

UTF-32の16進文字列を文字へ変換する方法

例えばUTF-16だと「3042」->「あ」、UTF-32だと「00003042」->「あ」へ変換するメソッド
NSStringの内部表現は2バイトまでなので、UTF-32の場合にはサロゲートペアでCFStringを使って表現し、NSStringにキャストしてやる必要がある。

//UTF-16の16進数コード文字列をNSStringへ変換
+ (NSString *) stringWithUTF16Code:(NSString *)codeNumber {
  NSScanner *scanner = [NSScanner scannerWithString:codeNumber];
  unsigned int value;
  [scanner scanHexInt:&value];
  const unichar c[1] = {value};
  return [NSString stringWithCharacters:c length:1];
}

//UTF-32の16進数コード文字列をNSStringへ変換
+ (NSString *) stringWithUTF32Code:(NSString *)codeNumber {
  
  NSScanner *scanner = [NSScanner scannerWithString:codeNumber];
  unsigned int value;
  [scanner scanHexInt:&value];
  
  UniChar characters[2];
  CFIndex length = (CFStringGetSurrogatePairForLongCharacter(value, characters) ? 2 : 1);
  
  NSString *retStr = (NSString *)CFStringCreateWithCharacters(NULL, characters, length);
  return [retStr autorelease];
}

参考:
http://www.cocoabuilder.com/archive/cocoa/169522-wchar-utf-32-to-nsstring-to-utf-16.html