NSString(2)

2010. 03. 26
引き続きNSStringクラスの説明です。

●ファイルからの文字列の生成と初期化(Creating and Initializing a String from a File)

・+ stringWithContentsOfFile:encoding:error:

+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error

指定したパスにあるファイルを読み込み、エンコードして文字列を作って返します
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)

path:ファイルの場所を示すパス
enc:パスの示しているファイルのエンコーディング
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSError *error;
NSString *オブジェクト = [NSString stringWithContentsOfFile:@"パス" encoding:NSJapaneseEUCStringEncoding error:&error];


・– initWithContentsOfFile:encoding:error:

– (id)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error

指定したパスのファイルを読み込み、エンコードして初期化したNSStringオブジェクトを返します
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)

path:ファイルの場所を示すパス
enc:パスの示しているファイルのエンコーディング
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSError *error;
NSString *オブジェクト = [[NSString alloc] initWithContentsOfFile:@"パス" encoding:NSShiftJISStringEncoding error:&error];


・+ stringWithContentsOfFile:usedEncoding:error:

+ (id)stringWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

指定したパスにあるファイルを読み込み、エンコードを自動判別して作った文字列を返します
このメソッドはファイルからエンコーディングを決定しようとします
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)

path:ファイルの場所を示すパス
enc:ファイルが正常に読み込まれた場合、エンコーディングを設定します
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSStringEncoding enc;
NSError *error;
NSString *オブジェクト = [NSString stringWithContentsOfFile:@"パス" usedEncoding:&enc error:&error];


・– initWithContentsOfFile:usedEncoding:error:

– (id)initWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

指定したパスにあるファイルを読み込み、エンコードを自動判別して初期化したNSStringオブジェクトを返します
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)

path:ファイルの場所を示すパス
enc:ファイルが正常に読み込まれた場合、エンコーディングを設定します
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSStringEncoding enc;
NSError *error;
NSString *オブジェクト = [[NSString alloc] initWithContentsOfFile:@"パス" usedEncoding:&enc error:&error];

※ usedEncoding:はファイルから自動判別したエンコードの結果を入れておくのですが、『藤棚工房別棟 ー徒然ー/Cocoaの文字コード自動判別,まだ試しに作ってみただけでちゃんと実装してないなら,そう書いてください!』によると、その判別はかなり怪しいものらしいです。

また、『Cocoa APIとか(iPhoneとか)/stringWithContentsOfFile:』では『Unicode以外はC文字列と判別』と書かれていますが、自分で試してないのでよく分かりません。


●URLからの文字列の生成と初期化(Creating and Initializing a String from an URL)

・+ stringWithContentsOfURL:encoding:error:

+ (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error

指定したURLをエンコードして作った文字列を返します
(URLが開けなかったりエンコーディングでエラーになった場合はnilを返します)

url:URLを読み込みます
enc:パスの示しているURLのエンコーディング
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSError *error;
NSString *オブジェクト = [NSString stringWithContentsOfURL:@"パス" encoding:NSJapaneseEUCStringEncoding error:&error];


・– initWithContentsOfURL:encoding:error:

– (id)initWithContentsOfURL:(NSURL *)url encoding:(MSStringEncoding)enc error:(NSError **)error

指定したURLをエンコードして初期化したNSStringオブジェクトを返します
(URLが開けなかったりエンコーディングでエラーになった場合はnilを返します)

url:URLを読み込みます
enc:パスの示しているURLのエンコーディング
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSError *error;
NSString *オブジェクト = [[NSString alloc] initWithContentsOfURL:@"パス" encoding:NSShiftJISStringEncoding error:&error];


・+ stringWithContentsOfURL:usedEncoding:error:

+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

指定したURLを自動判別して作った文字列を返します
このメソッドはURLからエンコーディングを決定しようとします
(URLが開けなかったりエンコーディングでエラーになった場合はnilを返します)

url:URLを読み込みます
enc:URLが正常に読み込まれた場合、エンコーディングを設定します
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSStringEncoding enc;
NSError *error;
NSString *オブジェクト = [NSString stringWithContentsOfURL:@"パス" usedEncoding:&enc error:&error];


・– initWithContentsOfURL:usedEncoding:error:

– (id)initWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

指定したURLを自動判別して初期化したNSStringオブジェクトを返します
このメソッドはURLからエンコーディングを決定しようとします
(URLが開けなかったりエンコーディングでエラーになった場合はnilを返します)

url:URLを読み込みます
enc:URLが正常に読み込まれた場合、エンコーディングを設定します
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSStringEncoding enc;
NSError *error;
NSString *オブジェクト = [[NSString alloc] initWithContentsOfURL:@"パス" usedEncoding:&enc error:&error];


●ファイルまたはURLヘの書き出し(Writing to a File or URL)

・– writeToFile:atomically:encoding:error:

– (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error

指定したエンコードでパスのファイルに書き出します
(書き出しが正常終了するとYES、異常終了した場合はNOを返します)

path:NSStringオブジェクトを書き出すファイルのパスを指定します
(パスの中にチルダ『~』が含まれている場合、このメソッドを呼び出す前にstringByExpandingTildeInPathで変換をかける必要があります)

useAuxiliaryFile:YESの場合、一度予備ファイルに書き出してから、本来指定したパスのファイルに書き換えます
そのため、書き出し途中にクラッシュしても元のパスのファイル内容は保証されます
NOの場合、直接指定したパスのファイルに書き出します

enc:パスの示しているファイルのエンコーディング

error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSError *error;
NSString *オブジェクト = [[NSString alloc]initWithString:@"文字列"];
[オブジェクト writeToFile:@"パス" atomically:YES encoding:NSISO2022JPStringEncoding error:&error]; 


・– writeToURL:atomically:encoding:error:

– (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error

指定したエンコードでパスのURLに書き出します

url:NSStringオブジェクトを書き出すURLを指定します

useAuxiliaryFile:YESの場合、一度予備ファイルに書き出してから、本来指定したURLに書き換えます
そのため、書き出し途中にクラッシュしても元のパスのファイル内容は保証されます
NOの場合、直接指定したパスのファイルに書き出します

enc:パスの示しているURLのエンコーディング

error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)

NSError *error;
NSString *オブジェクト = [[NSString alloc]initWithString:@"文字列"];
[オブジェクト writeToURL:@"パス" atomically:NO encoding:NSUTF8StringEncoding error:&error];


●文字列の長さの取得(Getting a String's Length)

・– length

– (NSUInteger)length

Unicode文字列の文字数を返します

NSString *オブジェクト = @"文字列";
int len = [オブジェクト length];


・– lengthOfBytesUsingEncoding:

– (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc

指定したエンコーディングに変換した場合に、必要な文字列のバイト数を返します
戻り値のバイト数にはエンコーディング情報も含みます(NULL終端のバイト数は含みません)
指定したエンコーディングで変換できない、または変換した文字列をメモリに格納できなかった(NSIntegerMaxを超える長さ)場合は0を返します

enc:NSStringオブジェクトの長さを求めるエンコーディング

NSString *オブジェクト = @"文字列";
[オブジェクト lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; 


・– maximumLengthOfBytesUsingEncoding:

– (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc

指定したエンコーディングに変換した場合に、必要な文字列の最大バイト数を返します
戻り値のバイト数にはエンコーディング情報も含みます(NULL終端のバイト数は含みません)
指定したエンコーディングで変換できない、または変換した文字列をメモリに格納できなかった(NSIntegerMaxを超える長さ)場合は0を返します

enc:NSStringオブジェクトの長さを求めるエンコーディング

NSString *オブジェクト = @"文字列";
[オブジェクト maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];

※ NSIntegerMaxは、NSObjCRuntime.hで

#define    NSIntegerMax    LONG_MAX

と定義され、LONG_MAXはlimits.hで

#define    LONG_MAX    2147483647L    /* max signed long */ 

と定義されています


●文字とバイトの取得(Getting Characters and Bytes)

・– characterAtIndex:

– (unichar)characterAtIndex:(NSUInteger)index

Unicodeの文字配列から指定した数値の位置にある文字を返します

index:文字配列から何文字目かを指定します(文字配列の総文字数内である必要があります)
総文字数を超えたindexを指定した場合、NSRangeExceptionで例外を発生させます

NSString *オブジェクト = @"文字列";

unichar chr = [オブジェクト characterAtIndex:72];


・– getCharacters:

– (void)getCharacters:(unichar *)buffer

指定したバッファ(メモリ領域)にUnicode文字列を書き込みます
バッファオーバーランを引き起こす可能性があるため非推奨(- getCharacters:range:の使用を推奨)

buffer:文字列を格納するバッファを指定します
書き込む文字列を十分に格納できる大きさのバッファが必要です
([string length] * sizeof(unichar))

NSString *オブジェクト = @"文字列";
unichar *chrBuffer = malloc([オブジェクト length] * sizeof(unichar));

[オブジェクト getCharacters:chrBuffer]; 


・– getCharacters:range:

– (void)getCharacters:(unichar *)buffer range:(NSRange)aRange

指定したバッファに、範囲内にあるUnicode文字列を書き込みます
このメソッドではNULL文字を追加しません

buffer:文字列を格納するバッファを指定します
書き込む文字列を十分に格納できる大きさのバッファが必要です
(aRange.length * sizeof(unichar))

aRange:格納する文字列の範囲を指定します
この範囲は書き込む文字列より大きく設定してはいけません
超える範囲を設定した場合、NSRangeExceptionで例外を発生させます

NSString *オブジェクト = @"文字列";
NSRange aRange = NSMakeRange(0,72);
unichar *chrBuffer = malloc(aRange.length * sizeof(unichar));
[オブジェクト getCharacters:chrBuffer range:aRange];


・– getBytes:maxLength:usedLength:encoding:options:range:remainingRange:

– (BOOL)getBytes:(void *)buffer maxLength:(NSUInteger)maxBuffer usedLength:(NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(NSRangePointer)leftover

指定したバッファに、エンコーディングと範囲を指定したバイト列を書き込みます
(バイト列にNULL終端は含みません)
書き込みが成功すればYESを、失敗した場合はNOを返します
(バッファがいっぱいになって失敗する場合もあれば、エンコーディングの変換ができなかった可能性も考えられます)

buffer:バイト列を格納するバッファを指定します
maxBuffer:バッファの最大バイト数を指定します
usedBufferCount:使用されたバッファのバイト数を格納します(不要の場合はNULLを指定します)
encoding:バイト列のエンコーディングを指定します
options:バイト列に書き込む際にエンコーディングを変換する必要がある場合に指定します
range:バイト列に書き込む範囲を指定します
leftover:指定範囲の内どこまで書き込んだかという結果をポインタで格納します(不要の場合はNULLを指定します)

NSString *オブジェクト = @"文字列";
unsigned char chrBuffer[72];
NSRange aRange = NSMakeRange(0,72);
[オブジェクト getBytes:chrBuffer maxLength:72 usedLength:NULL encoding:NSUTF8StringEncoding options:NSStringEncodingConversionExternalRepresentation range:aRange remainingRange:NULL];

※ sizeof演算子は、引数に渡された型や変数、定数などを渡すとメモリサイズを返すものです


NSRangeは列中の位置と範囲を示す構造体で、NSRange.hで定義されています

typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;

NSStringEncodingConversionOptionsはエンコーディングの変換を行う際のオプションで、NSString.hで定義されています

typedef NSUInteger NSStringEncodingConversionOptions;

NSString Class ReferenceのNSStringEncodingConversionOptionsの項目で、Discussionの飛び先が同項目を指してループ状態になっていますが、正しくはすぐ下にある『Encoding Conversion Options』です

Encoding Conversion Optionsで、文字列エンコーディングの変換オプションを示しています

enum {
    NSStringEncodingConversionAllowLossy = 1,
    NSStringEncodingConversionExternalRepresentation = 2
};

前者は不可逆変換を、後者は可逆変換を指します

例えばUnicodeからASCIIに変換する場合、不可逆変換では変換しきれない文字は削除ないし置換しようとしますが、可逆変換の場合はバイトオーダーなど必要な情報を残します
(試していないので実際の挙動は分かりません)


●C文字列の取得(Getting C Strings)


・– cStringUsingEncoding:

– (const char *)cStringUsingEncoding:(NSStringEncoding)encoding

指定したエンコーディングでC文字列を返します
エンコーディングの変換で不可逆変換ができなかった場合はNULLを返します

戻り値であるC文字列は、元になるNSStringオブジェクトの文字列が解放される、あるいは自動解放が行われると消滅しますので、必要な場合はgetCString:maxLength:encoding:を使用してください
(自動解放については『Objective-C言語のメモ書き(7)』を参照)

また、canBeConvertedToEncoding:で不可逆変換が可能かをチェックできます
それができない場合はdataUsingEncoding:allowLossyConversion:を使ってC文字列に変換できますが、その場合NULL終端など情報が欠落するので注意が必要です

encoding:C文字列のエンコーディング

NSString *オブジェクト = @"文字列";
[オブジェクト cStringUsingEncoding:NSASCIIStringEncoding]; 


・– getCString:maxLength:encoding:

– (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding

指定したエンコーディングで変換したC文字列をバッファに格納します
成功すればYESを、失敗した場合はNOを返します
(確保したバッファが小さくて失敗する場合もあれば、エンコーディングの変換ができなかった可能性も考えられます)

また、canBeConvertedToEncoding:で不可逆変換が可能かをチェックできます
それができない場合はdataUsingEncoding:allowLossyConversion:を使ってC文字列に変換できますが、その場合NULL終端など情報が欠落するので注意が必要です

buffer:C文字列にNULL終端を付加して格納します
maxBufferCount:NULL終端分を含めたC文字列を格納できるバッファサイズを指定します
encoding:C文字列のエンコーディング

NSString *オブジェクト = @"文字列";
unsigned char chrBuffer[72];
[オブジェクト getCString:chrBuffer maxLength:91 encoding:NSASCIIStringEncoding];


・– UTF8String

– (const char *)UTF8String

NULL終端のUTF8エンコーディングのC文字列を返します
戻り値であるC文字列は、元になるNSStringオブジェクトの文字列が解放される、あるいは自動解放が行われると消滅しますので、必要な場合はコピーを取って下さい

NSString *オブジェクト = @"文字列";
const char *cPtr;
cPtr = [オブジェクト UTF8String];



参考文献

NSString Class Reference

Cocoa APIとか(iPhoneとか)/NSString

Studying Cocoa/NSString

Nothing Upstairs/Cocoaのエンコーディングはどうなっておるのだ?

Cocoa APIとか(iPhoneとか)/stringWithContentsOfFile:

せりか式/C言語チュートリアル/sizeof演算子

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る

0 CommentsPosted in 資料





QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
Sun Mon Tue Wed Thu Fri Sat
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

QuietControl 30 wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR