Cocoa で日本語


HOME > TIPS > Cocoa Programming Tips 1001 > Miscellaneous > Cocoa で日本語

Cocoa で日本語

Miscellaneous - Cocoa で日本語

エンコードを指定して、NSData <-> NSString を変換する

Keywords:directoryContentsAtPath, enumeratorAtPath, subpathsAtPath

Cocoa では NSData(つまり生のデータ)と NSString(つまり文字列)はきっちり区別されるんだ。NSData ってのは、たとえばファイルから取り出した、生のバイト列だ。C で英文を扱うときなんかは、それをそのまま文字列として扱っちゃうんだけど、Cocoa の場合はそうしない。文字列として扱うときは、NSString に変換してやる。そして、その変換にはエンコーディングを指定してやる必要があるんだ。

NSData をエンコードを指定して、NSString に変換してやる場合は、NSString のメソッド initWithData:encoding: を使う。

Foundation/NSString.h

- (id)initWithData:(NSData *)data
   encoding:(NSStringEncoding)encoding;

逆に、NSString をエンコードを指定して、NSData に変換してやる場合は、dataUsingEncoding: を使うんだ。

Foundation/NSString.h

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding;

これらは、たとえば、日本語ファイルを取り扱うときに使うんだ。ドキュメント・ベース・アプリケーションを作っているときに、あらかじめエンコードが分かっているファイルを開くるとき、またはエンコードを指定して開きたいときに、次みたいな感じで使えるんだ。

MyDocument.m (sample)

- (BOOL)loadDataRepresentation:(NSData*)data
    ofType:(NSString*)type
{
 // Get encoding
 _encoding = [[NSDocumentController sharedDocumentController] encoding];

 // Make string from data
 [_string release];
 _string = [[NSString alloc] initWithData:data encoding:_encoding];
 [_string retain];

 return YES;
}

ここで用意しているサンプルでは、オープンダイアログでエンコードを指定しているんだ。そのエンコードを使って、渡された NSData を NSString に変換してやっている。

openDialog-1.jpg

ファイルを保存するときは、次のような感じ。

MyDocument.m (sample)

- (NSData*)dataRepresentationOfType:(NSString*)type
{
 if (!_string) {
  return nil;
 }

 // Make data from string
 return [_string dataUsingEncoding:_encoding];
}

エンコードを指定して、NSData に戻してやっている。これが、エンコードといっしょに日本語の NSData、NSString を使う方法だ。

■サンプルダウンロード:
OpenWithEncoding.tar





Miscellaneous - Cocoa で日本語

日本語用の NSCharacterSet を作る

Keywords: NSCharacterSet

Cocoa では、ある文字コードが何に属しているか(アルファベットなのか、数字なのか)というのを調べるのに、NSCharacterSet を使う。ここでは日本語用の NSCharacterSet を作ってみた。

日本語用の NSCharacterSet というのは、日本語の文章で使われる文字の集合(ひらがな、カタカナ、漢字、全角英数字、半角英数字)を判別するものだ。NSCharacterSet を作るには、Unicode の表が必要。www.unicode.org から手に入れることができるぜ。

普通に考えれば、Unicode における日本語の集合ってのは、一意に決定されるはずだ。だけどそううまくはいかなくて、ベンダーごとに異なってしまっているらしい。本来ならば、誰かが音頭を取って統一しないといけないんだけど、もう出回っちゃっているからうまくいかないようだ。

変換の表はここから取ることができる。JIS の変換テーブルは obsolete の下にあるけど、廃止されたというよりは、Unicode.org が保証するものではない、っていうスタンスらしい。このページ「変換表がベンダーによって異なる」が変換表の混乱について詳しいです。

で、そこから得られる表から Unicode を切り出して NSCharacterSet を作ってみよう。以下のものを作ってみた。

NSCharacterSetEx.h (sample)

+ (id)JIS0208HiraganaSet;
+ (id)JIS0208KatakanaSet;
+ (id)JIS0208KanjiSet;
+ (id)JIS0208FullWidthAlnumSet;

+ (id)ShiftJISSet;

+ (id)MacOSJapaneseSet;

+ (id)WindowsJapanseSet;

JIS0208 が基本的なセット。ShiftJIS は ASCII と半角カナを含むもの。MacOS と Windows はそれぞれ機種依存文字を含んだものだ。本来なら JIS0208 にあたる部分は同じ Unicode に変換されるべきなんだけど、微妙に違うらしい。微妙っていっても、1 文字違えば大問題なわけで。ま、そこのところを留意すれば、日本語環境で使われる文字の NSCharacterSet になるんだ。

■サンプルダウンロード:
OpenJapaneseEncoding.tar