Geometry 関数
NSBundle
NSDictionary
NSFileManager
NSMutableAttributedString
NSNumber
NSScanner
NSString
NSTimer
Graphic 関数
NSApplication
NSBezierPath
NSCell
NSColor
NSCursor
NSCustomImageRep
NSDocument
NSDocumentController
NSDragging
NSEvent
NSFontManager
NSGraphicsContext
NSImage
NSMenu
NSOutlineView
NSPanel
NSPopUpButton
NSResponder
NSScrollView
NSString 追加
NSTableColumn
NSTableView
NSTextStorage
NSTextView
NSToolbar
NSView
NSWindow
NSWorkspace
その他
.nib ウィンドウ
Views パレット
クラス
インスタンス変数
メソッド
CFXML
Carbon Event
Carbon Graphics
Cocoa で日本語
-エンコードを指定して、NSData <-> NSString を変換する
-日本語用の NSCharacterSet を作る
メソッド
その他

- 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



[Home] [Download] [Archives] [BBS] [Cocoa Programming Tips 1001] [Core Foundation の秘密] [Safari Developer Center] [はじめてのブラウザのつくり方] [Sketch BP] [スクリーンセイバーを作ろう] [Objective-C 最適化] [Authorization API 完全理解] [Mac OS X Programming Books Review] [オブジェクト指向の言語比較論] [panther-dev]

mailto: mkino@xd5.so-net.ne.jp