|
- Miscellaneous-
Cocoa で日本語
Miscellaneous - Cocoa で日本語
エンコードを指定して、NSData <-> NSString を変換する
Keywords: initWithData:encoding:, dataUsingEncoding:
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 に変換してやっている。

ファイルを保存するときは、次のような感じ。
MyDocument.m (sample)
- (NSData*)dataRepresentationOfType:(NSString*)type
{
if (!_string) {
return nil;
}
// Make data from string
return [_string dataUsingEncoding:_encoding];
}
エンコードを指定して、NSData に戻してやっている。これが、エンコードといっしょに日本語の NSData、NSString を使う方法だ。
■サンプルダウンロード:
OpenWithEncoding.tar.gz
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.gz
|