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を指定します)
・– initWithContentsOfFile:encoding:error:
– (id)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error
指定したパスのファイルを読み込み、エンコードして初期化したNSStringオブジェクトを返します
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)
path:ファイルの場所を示すパス
enc:パスの示しているファイルのエンコーディング
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)
・+ stringWithContentsOfFile:usedEncoding:error:
+ (id)stringWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
指定したパスにあるファイルを読み込み、エンコードを自動判別して作った文字列を返します
このメソッドはファイルからエンコーディングを決定しようとします
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)
path:ファイルの場所を示すパス
enc:ファイルが正常に読み込まれた場合、エンコーディングを設定します
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)
・– initWithContentsOfFile:usedEncoding:error:
– (id)initWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
指定したパスにあるファイルを読み込み、エンコードを自動判別して初期化したNSStringオブジェクトを返します
(ファイルが開けなかったりエンコーディングでエラーになった場合はnilを返します)
path:ファイルの場所を示すパス
enc:ファイルが正常に読み込まれた場合、エンコーディングを設定します
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)
※ 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を指定します)
・– initWithContentsOfURL:encoding:error:
– (id)initWithContentsOfURL:(NSURL *)url encoding:(MSStringEncoding)enc error:(NSError **)error
指定したURLをエンコードして初期化したNSStringオブジェクトを返します
(URLが開けなかったりエンコーディングでエラーになった場合はnilを返します)
url:URLを読み込みます
enc:パスの示しているURLのエンコーディング
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)
・+ stringWithContentsOfURL:usedEncoding:error:
+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
指定したURLを自動判別して作った文字列を返します
このメソッドはURLからエンコーディングを決定しようとします
(URLが開けなかったりエンコーディングでエラーになった場合はnilを返します)
url:URLを読み込みます
enc:URLが正常に読み込まれた場合、エンコーディングを設定します
error:エラーが発生した場合、エラー内容をNSErrorオブジェクトで返します
(エラー内容が不要な場合はNULLを指定します)
・– 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を指定します)
●ファイルまたは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を指定します)
・– 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を指定します)
●文字列の長さの取得(Getting a String's Length)
・– length
– (NSUInteger)length
Unicode文字列の文字数を返します
・– lengthOfBytesUsingEncoding:
– (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc
指定したエンコーディングに変換した場合に、必要な文字列のバイト数を返します
戻り値のバイト数にはエンコーディング情報も含みます(NULL終端のバイト数は含みません)
指定したエンコーディングで変換できない、または変換した文字列をメモリに格納できなかった(NSIntegerMaxを超える長さ)場合は0を返します
enc:NSStringオブジェクトの長さを求めるエンコーディング
・– maximumLengthOfBytesUsingEncoding:
– (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc
指定したエンコーディングに変換した場合に、必要な文字列の最大バイト数を返します
戻り値のバイト数にはエンコーディング情報も含みます(NULL終端のバイト数は含みません)
指定したエンコーディングで変換できない、または変換した文字列をメモリに格納できなかった(NSIntegerMaxを超える長さ)場合は0を返します
enc:NSStringオブジェクトの長さを求めるエンコーディング
※ NSIntegerMaxは、NSObjCRuntime.hで
と定義され、LONG_MAXはlimits.hで
と定義されています
●文字とバイトの取得(Getting Characters and Bytes)
・– characterAtIndex:
– (unichar)characterAtIndex:(NSUInteger)index
Unicodeの文字配列から指定した数値の位置にある文字を返します
index:文字配列から何文字目かを指定します(文字配列の総文字数内である必要があります)
総文字数を超えたindexを指定した場合、NSRangeExceptionで例外を発生させます
・– getCharacters:
– (void)getCharacters:(unichar *)buffer
指定したバッファ(メモリ領域)にUnicode文字列を書き込みます
バッファオーバーランを引き起こす可能性があるため非推奨(- getCharacters:range:の使用を推奨)
buffer:文字列を格納するバッファを指定します
書き込む文字列を十分に格納できる大きさのバッファが必要です
([string length] * sizeof(unichar))
・– getCharacters:range:
– (void)getCharacters:(unichar *)buffer range:(NSRange)aRange
指定したバッファに、範囲内にあるUnicode文字列を書き込みます
このメソッドではNULL文字を追加しません
buffer:文字列を格納するバッファを指定します
書き込む文字列を十分に格納できる大きさのバッファが必要です
(aRange.length * sizeof(unichar))
aRange:格納する文字列の範囲を指定します
この範囲は書き込む文字列より大きく設定してはいけません
超える範囲を設定した場合、NSRangeExceptionで例外を発生させます
・– 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を指定します)
※ sizeof演算子は、引数に渡された型や変数、定数などを渡すとメモリサイズを返すものです
NSRangeは列中の位置と範囲を示す構造体で、NSRange.hで定義されています
NSStringEncodingConversionOptionsはエンコーディングの変換を行う際のオプションで、NSString.hで定義されています
NSString Class ReferenceのNSStringEncodingConversionOptionsの項目で、Discussionの飛び先が同項目を指してループ状態になっていますが、正しくはすぐ下にある『Encoding Conversion Options』です
Encoding Conversion Optionsで、文字列エンコーディングの変換オプションを示しています
前者は不可逆変換を、後者は可逆変換を指します
例えば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文字列のエンコーディング
・– 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文字列のエンコーディング
・– UTF8String
– (const char *)UTF8String
NULL終端のUTF8エンコーディングのC文字列を返します
戻り値であるC文字列は、元になるNSStringオブジェクトの文字列が解放される、あるいは自動解放が行われると消滅しますので、必要な場合はコピーを取って下さい
参考文献
・NSString Class Reference
・Cocoa APIとか(iPhoneとか)/NSString
・Studying Cocoa/NSString
・Nothing Upstairs/Cocoaのエンコーディングはどうなっておるのだ?
・Cocoa APIとか(iPhoneとか)/stringWithContentsOfFile:
・せりか式/C言語チュートリアル/sizeof演算子
●ファイルからの文字列の生成と初期化(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];
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];
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];
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];
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];
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];
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];
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];
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];
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];
NSString *オブジェクト = [[NSString alloc]initWithString:@"文字列"];
[オブジェクト writeToURL:@"パス" atomically:NO encoding:NSUTF8StringEncoding error:&error];
●文字列の長さの取得(Getting a String's Length)
・– length
– (NSUInteger)length
Unicode文字列の文字数を返します
NSString *オブジェクト = @"文字列";
int len = [オブジェクト length];
int len = [オブジェクト length];
・– lengthOfBytesUsingEncoding:
– (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc
指定したエンコーディングに変換した場合に、必要な文字列のバイト数を返します
戻り値のバイト数にはエンコーディング情報も含みます(NULL終端のバイト数は含みません)
指定したエンコーディングで変換できない、または変換した文字列をメモリに格納できなかった(NSIntegerMaxを超える長さ)場合は0を返します
enc:NSStringオブジェクトの長さを求めるエンコーディング
NSString *オブジェクト = @"文字列";
[オブジェクト lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
[オブジェクト lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
・– maximumLengthOfBytesUsingEncoding:
– (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc
指定したエンコーディングに変換した場合に、必要な文字列の最大バイト数を返します
戻り値のバイト数にはエンコーディング情報も含みます(NULL終端のバイト数は含みません)
指定したエンコーディングで変換できない、または変換した文字列をメモリに格納できなかった(NSIntegerMaxを超える長さ)場合は0を返します
enc:NSStringオブジェクトの長さを求めるエンコーディング
NSString *オブジェクト = @"文字列";
[オブジェクト maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
[オブジェクト 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));
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];
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];
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;
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
};
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];
[オブジェクト 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];
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];
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) (2009/09/08) 木下 誠 商品詳細を見る |
詳解 Objective-C 2.0 第3版 (2011/12/28) 荻原 剛志 商品詳細を見る |