fc2ブログ

NSString(4)

2010. 03. 30
和訳どころか英語でも詳しい解説が無いメソッドがあって難儀してますが、引き続きNSStringクラスの説明です。

●行と段落範囲の判別(Determining Line and Paragraph Ranges)

・– getLineStart:end:contentsEnd:forRange:

– (void)getLineStart:(NSUInteger *)startIndex end:(NSUInteger *)lineEndIndex contentsEnd:(NSUInteger *)contentsEndIndex forRange:(NSRange)aRange

指定した範囲の行の開始位置と終了位置(改行コード含む/含まない)を返します

改行を判別する記号(改行コード)は次の通りです
・U+000D:\r または CR(Carriage return:行頭への復帰。行送りは含まない)
・U+2028:Unicode line separator(行区切り記号)
・U+000A:\n または LF(Line Feed:行送り。行頭への復帰は含まない)
・U+2029:Unicode paragraph separator(段落区切り記号)
・ またはCRLF

startIndex:指定した範囲にある行の先頭文字位置を返します
必要が無い場合はNULLを指定します

lineEndIndex:指定した範囲にある行の改行コード含む終端文字位置を返します
必要が無い場合はNULLを指定します

contentsEndIndex:指定した範囲にある行の改行コード含まない終端文字位置を返します
必要が無い場合はNULLを指定します

aRange:検索する行のある範囲を指定します
この範囲は検索するNSStringオブジェクトより大きく設定してはいけません
超える範囲を設定した場合、NSRangeExceptionで例外を発生させます

unsigned int lineStart, lineEnd, contEnd;
NSString *オブジェクト1 = @"Haruka\rChihaya\nYukiho\r\nYayoi";
[オブジェクト1 getLineStart:&lineStart end:&lineEnd contentsEnd:&contEnd forRange:NSMakeRange(19, 2)] ;
NSString *オブジェクト2 = [NSString stringWithFormat:@"LineStart=%d, LineEnd=%d, ContentsEnd=%d", lineStart, lineEnd, contEnd]; 

文字位置は0から数え、改行コードは1文字として扱います。
サンプルコードの例文の文字位置は下表のようになります。

 0 1 2 3 4 5 6 7 8 91011121314
Haruka\rChihaya\n

15161718192021222324252627
Yukiho\r\nYayo

改行コードを跨がない範囲を指定(19文字目から2文字分、つまりYukihoの『ho』)すると、
LineStart=15, LineEnd=23, ContentsEnd=21
という結果になります。

開始位置はともかく、終端位置が一つずれているように感じますが、『その一つ手前までが範囲』という解釈のようです。
(その方が『終端位置から文字列を追加』などをしようとした際に指定し易いからと思われます)

実際、改行コードを2つ跨いだ範囲指定(10文字目から14文字分、ChihayaのhayaからYayoiのYまで)をすると、
LineStart=7, LineEnd=28, ContentsEnd=28
という結果になりますが、実際には28文字目は存在しません(28文字目を表示しようとするとエラーになります)。


・- lineRangeForRange:

– (NSRange)lineRangeForRange:(NSRange)aRange

指定した範囲にある行の全体範囲を返します(改行コードも含みます)

aRange:検索する行のある範囲を指定します

NSString *オブジェクト1 = @"Haruka\rChihaya\nYukiho\r\nYayoi";
NSRange rng = [オブジェクト1 lineRangeForRange:NSMakeRange(12, 5)] ;
NSLog([NSString stringWithFormat:@"Location=%d, Length=%d" , rng.location, rng.length]);    //    {7, 16} 


・– getParagraphStart:end:contentsEnd:forRange:

– (void)getParagraphStart:(NSUInteger *)startIndex end:(NSUInteger *)endIndex contentsEnd:(NSUInteger *)contentsEndIndex forRange:(NSRange)aRange

指定した範囲の段落の開始位置と終了位置(改行コード含む/含まない)を返します

段落を判別する記号(改行コード)は次の通りです
・U+000D:\rまたは CR(Carriage return:行頭への復帰。行送りは含まない)
・U+000A:\nまたは LF(Line Feed:行送り。行頭への復帰は含まない)
・U+2029:Unicode paragraph separator(段落区切り記号)
・ またはCRLF

– getLineStart:end:contentsEnd:forRange:との違いはUnicode line separator(行区切り記号:U+2028)を判別するかどうかです

getLine~ではUnicode line separatorにも反応し行末と判断しますが、getParagraph~は段落末と判断せずスルーします(getLine~はUnicode paragraph separatorも行末と判断します)

逆に言えば、本来段落末(Unicode paragraph separator)だけに反応してほしいgetLine~が、改行コードである 、\rや\nにも反応してしまいますので注意が必要です

startIndex:指定した範囲にある段落の先頭文字位置を返します
必要が無い場合はNULLを指定します

lineEndIndex:指定した範囲にある段落の改行コード含む終端文字位置を返します
必要が無い場合はNULLを指定します

contentsEndIndex:指定した範囲にある段落の改行コード含まない終端文字位置を返します
必要が無い場合はNULLを指定します

aRange:検索する段落のある範囲を指定します
この範囲は検索するNSStringオブジェクトより大きく設定してはいけません
超える範囲を設定した場合、NSRangeExceptionで例外を発生させます

unsigned int paraStart, paraEnd, contEnd;
NSString *オブジェクト1 = @"Haruka\u2028
Chihaya
\u2029Yukiho\r\nYayoi";
[オブジェクト1 getParagraphStart:¶Start end:¶End contentsEnd:&contEnd forRange:NSMakeRange(2, 2)] ;
NSString *オブジェクト2 = [NSString stringWithFormat:@"ParagraphStart=%d, ParagraphEnd=%d, ContentsEnd=%d", paraStart, paraEnd, contEnd]; 

– getLineStart:end:contentsEnd:forRange:のサンプル文字列の改行コードを、Unicode line separatorとUnicode paragraph separatorに置き換えました
 
 0 1 2 3 4 56 7 8 91011121314
Haruka\u2028Chihaya\u2029

15161718192021222324252627
Yukiho\r\nYayo

改行コードを跨がない範囲を指定(2文字目から2文字分、つまりHarukaの『ru』)すると、
LineStart=0, LineEnd=15, ContentsEnd=14
という結果になります。

前述の通り、6文字目のUnicode line separatorを\rや\nにすると、
LineStart=0, LineEnd=7, ContentsEnd=6
になります


・– paragraphRangeForRange:

– (NSRange)paragraphRangeForRange:(NSRange)aRange

指定した範囲にある段落の全体範囲を返します(Unicode paragraph separatorも含みます)

aRange:検索する行のある範囲を指定します

NSString *オブジェクト1 = @"Haruka\u2028
Chihaya\u2029
Yukiho\r\nYayoi";
NSRange rng = [オブジェクト1 paragraphRangeForRange:NSMakeRange(2, 2)] ;
NSLog([NSString stringWithFormat:@"Location=%d, Length=%d" , rng.location, rng.length]);    //    {0, 15} 


●合成済文字範囲の判別(Determining Composed Character Sequences)

・– rangeOfComposedCharacterSequenceAtIndex:

– (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)anIndex

指定した位置の文字範囲を判別して返します

Unicodeでは結合文字という、濁点や半濁点などを前の文字と合成して1文字として表示するものがあります。
(他にも色々ありますのでWikipedia/Unicodeの互換文字を参照してください)

このように結合文字の場合、表示上1文字でもコード上では複数文字で構成されている場合が有るため、その検出に使えます

anIndex:文字範囲を判別する文字位置を指定します

NSString *オブジェクト = @"ゆきぽ\u2028
ゆきほ\u309A
\u2029
";
NSRange rng = [オブジェクト rangeOfComposedCharacterSequenceAtIndex:6];
NSLog([NSString stringWithFormat:@"Location=%d, Length=%d, %@" , rng.location, rng.length, [str substringWithRange:NSMakeRange(4, 4)]]); 

サンプルコードの文字列は下記のようになっています
 
012 345678
\u2028\u309A\u2029

7文字目は『゚(U+309A)』で、6文字目と合わせて表示上は『ぽ』となりますが、結果は
Location=6, Length=2, ゆきぽ
となります

ちなみに、rangeOfComposedCharacterSequenceAtIndex:2、NSMakeRange(0, 3)では、
Location=2, Length=1, ゆきぽ
という結果になります


・– rangeOfComposedCharacterSequencesForRange:

– (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range

指定した範囲の文字範囲を判別して返します

Unicodeでは結合文字という、濁点や半濁点などを前の文字と合成して1文字として表示するものがあります。
(他にも色々ありますのでWikipedia/Unicodeの互換文字を参照してください)

このように結合文字の場合、表示上1文字でもコード上では複数文字で構成されている場合が有るため、その検出に使えます

range:文字範囲を判別する範囲を指定します
この範囲は検索するNSStringオブジェクトより大きく設定してはいけません

NSString *オブジェクト = @"ゆきぽ\u2028
ゆきほ\u309A
\u2029";
NSRange rng = [オブジェクト rangeOfComposedCharacterSequenceForRange:NSMakeRange(6, 3)];
NSLog([NSString stringWithFormat:@"Location=%d, Length=%d, %@" , rng.location, rng.length, [str substringWithRange:NSMakeRange(4, 4)]]); 

範囲指定で4文字目から3文字分(ゆきほ)を指定すると、
Location=4, Length=4, ゆきぽ
となり、結合文字を認識して数えている事が分かります



参考文献

NSString Class Reference

Cocoa APIとか(iPhoneとか)/NSString

Studying Cocoa/NSString

Wikipedia/改行コード

Predicate Programming Guide

String Programming Guide for Cocoa

合成文字対応

Wikipedia/Unicodeの互換文字

0 CommentsPosted in 資料

NSString(3)

2010. 03. 28
引き続きNSStringクラスの説明です(今回のでまだ半分・・・)。


●文字列の結合(Combining Strings)

・– stringByAppendingFormat:

– (NSString *)stringByAppendingFormat:(NSString *)format ...

指定したフォーマットで文字列を追加して返します
(formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

format:フォーマット(書式)については『NSStringオブジェクトの書式』を参照してください
(nilを指定することはできません)

...:カンマ区切りで値を指定します

NSString *オブジェクト1 = @"文字列";
NSString *オブジェクト2 = [[NSString alloc] stringByAppendingFormat:@"BST-%d-CHIHAYA", 72]; 


・– stringByAppendingString:

– (NSString *)stringByAppendingString:(NSString *)aString

指定した文字列を追加した新規の文字列を返します
(formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

aString:NSStringオブジェクトに追加する文字列です(nilを指定することはできません)

NSString *オブジェクト1 = @"文字列1";
NSString *オブジェクト2 = @"文字列2";
NSString *オブジェクト3 = [オブジェクト1 stringByAppendingString:文字列2]; 


・– stringByPaddingToLength:withString:startingAtIndex:

– (NSString *)stringByPaddingToLength:(NSUInteger)newLength withString:(NSString *)padString startingAtIndex:(NSUInteger)padIndex

NSStringオブジェクトを指定した範囲の長さにし、余った文字は取り除き、足りない分は穴埋めして文字列を返します

newLength:NSStringオブジェクトの新たな長さを指定します
padString:穴埋めする文字列を指定します
padIndex:穴埋めする文字列の開始位置を指定します

NSString *オブジェクト = @"BST-72-";
[オブジェクト stringByPaddingToLength:14 withString:@"CHIHAYA" startingAtIndex:0];


●文字列の分割(Dividing Strings)

・– componentsSeparatedByString:

– (NSArray *)componentsSeparatedByString:(NSString *)separator

NSStringオブジェクトの文字列を、指定した文字列で分割した文字配列にして返します

separator:分割に使用する文字列

NSString *オブジェクト = @"BST-72-CHIHAYA";
NSArray *ary = [オブジェクト componentsSeparatedByString:@"-"];
NSLog(@"%@", ary);    //    (BST, 72, CHIHAYA) 


・– componentsSeparatedByCharactersInSet:

– (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator

NSStringオブジェクトの文字列を、指定した文字集合で分割した文字配列にして返します
(componentsSeparatedByString:が単一の文字列で分割するのに対し、複数の文字列を指定できます)

separator:分割に使用する文字集合(nilを指定することはできません)

NSString *オブジェクト = @"http://secondflush2.blog.fc2.com/";
NSCharacterSet *spr = [NSCharacterSet characterSetWithCharactersInString:@".:/"];
NSArray *ary = [オブジェクト = componentsSeparatedByCharactersInSet:spr];
NSLog(@"%@", ary);    //    (http, secondflush2, blog, fc2, com) 


・– stringByTrimmingCharactersInSet:

– (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set

NSStringオブジェクトの文字列の両端から、指定した文字集合を取り除いた文字列を返します
元の文字列が除外する文字集合のみで構成されていた場合、空の文字列を返します

set:除外する文字集合(nilを指定することはできません)
文字集合にはwhitespaceCharacterSet(空白とタブ)やwhitespaceAndNewlineCharacterSet(空白とタブ、改行文字)などの標準文字集合の他、componentsSeparatedByCharactersInSet:でカスタマイズも指定できます

NSString *オブジェクト = @"    B W H    72 55 78    ";
[オブジェクト stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];


・– substringFromIndex:

– (NSString *)substringFromIndex:(NSUInteger)anIndex

先頭から指定した文字位置までを削除した部分文字列を、新規の文字列で返します

anIndex:文字列の中から切り取る部分までの文字位置を指定します
文字列の長さを超える文字位置を指定した場合、NSRangeExceptionで例外を発生させます
文字列の長さと同じ文字位置を指定した場合は、空の文字列を返します

NSString *オブジェクト = @"Air-D Cup";
[オブジェクト substringFromIndex:4];    //    D Cup


・– substringWithRange:

– (NSString *)substringWithRange:(NSRange)aRange

指定した範囲の部分文字列を返します

aRange:切り取る範囲を指定します
元の文字列の範囲を超えてはいけません
(文字列を超える範囲を指定した場合、NSRangeExceptionで例外を発生させます)

NSString *オブジェクト = @"BST-72-CHIHAYA";
[オブジェクト substringWithRange:NSMakeRange(4, 2)];    //    72


・– substringToIndex:

– (NSString *)substringToIndex:(NSUInteger)anIndex

先頭から指定した文字までの部分文字列を、新規の文字列で返します

anIndex:文字列の中から切り取る部分までの文字位置を指定します
文字列と同じ長さまで指定可能です
文字列の長さを超える文字位置を指定した場合、NSRangeExceptionで例外を発生させます

NSString *オブジェクト = @"BST-72-CHIHAYA";
[オブジェクト substringToIndex:6];    //    BST-72

※ 標準文字集合(Creating a Standard Character Set)はNSCharacterSetクラスのメソッドです

+ alphanumericCharacterSetアルファベット、記号、数字
+ capitalizedLetterCharacterSetタイトルケース(一文字目のみ大文字)
+ controlCharacterSet制御・書式文字
(UnicodeのU+0000~U+001FとU+007F~U+009F)
+ decimalDigitCharacterSet10進数の数字(0~9)
+ decomposableCharacterSetUnicode 3.2の全標準文字
(Unicode 2.0で定義されたハングルは含まず)
+ illegalCharacterSet非文字またはUnicode 3.2標準文字で未定義の文字
+ letterCharacterSetアルファベット、記号、表意文字
+ lowercaseLetterCharacterSet小文字のアルファベット
+ newlineCharacterSet改行文字(UnicodeのU+000A~U+000D、U+0085)
+ nonBaseCharacterSet記号
+ punctuationCharacterSet句読点(空白を除く、ピリオド、ダッシュ、カッコなど)
+ symbolCharacterSetシンボル($、+など)
+ uppercaseLetterCharacterSet大文字のアルファベットとタイトルケース
+ whitespaceAndNewlineCharacterSet空白とタブ、改行文字
(UnicodeのU+0020、U+0009、U+000A~U+000D、U+0085)
+ whitespaceCharacterSet空白とタブ(UnicodeのU+0020とU+0009)


●文字と部分文字列の検索(Finding Characters and Substrings)

・– rangeOfCharacterFromSet:

– (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)aSet

指定した文字集合を検索し、最初に見つけた文字集合の範囲を返します
指定した文字集合が見つけられなかった場合、{NSNotFound, 0}を返します

aSet:検索する文字集合(nilを指定することはできません)
(aSetがnilの場合、NSInvalidArgumentExceptionを呼び出します)

NSString *オブジェクト = @"BST-72-CHIHAYA";
[オブジェクト rangeOfCharacterFromSet:@"72"];    //    {4, 2}


・– rangeOfCharacterFromSet:options:

– (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)aSet options:(NSStringCompareOptions)mask

指定した文字集合をオプション付き検索し、最初に見つけた文字集合の範囲を返します
指定した文字集合が見つけられなかった場合、{NSNotFound, 0}を返します

aSet:検索する文字集合(nilを指定することはできません)
(aSetがnilの場合、NSInvalidArgumentExceptionを呼び出します)

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSBackwardsSearch)を指定します
or演算子『|』で複数オプションを指定可能です

NSString *オブジェクト = @"Makoto73 Yayoi72 Chihaya72";
[オブジェクト rangeOfCharacterFromSet:@"72" option:NSBackwardsSearch];    //    {24, 2}


・– rangeOfCharacterFromSet:options:range:

– (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)aSet options:(NSStringCompareOptions)mask range:(NSRange)aRange

指定した文字集合を範囲とオプション付き検索し、最初に見つけた文字集合の範囲を返します
指定した文字集合が見つけられなかった場合、{NSNotFound, 0}を返します
結合文字などで1文字を検索した結果が1文字以上になる場合があります
(例:文字集合『stru¨del』から『ü』を検索した場合、結果範囲が{3,2}になります)

aSet:検索する文字集合(nilを指定することはできません)
(aSetがnilの場合、NSInvalidArgumentExceptionを呼び出します)

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSBackwardsSearch)を指定します
or演算子『|』で複数オプションを指定可能です

aRange:検索範囲を指定します
元の文字列の範囲を超えてはいけません
(文字列を超える範囲を指定した場合、NSRangeExceptionで例外を発生させます)

NSString *オブジェクト = @"Makoto73 Yayoi72 Chihaya72";
[オブジェクト rangeOfCharacterFromSet:@"72" option:NSCaseInsensitiveSearch range:NSMakeRange(17, 9)];    //    {24, 2}


・– rangeOfString:

– (NSRange)rangeOfString:(NSString *)aString

指定した文字列を検索し、最初に見つけた文字列の範囲を返します
指定した文字列が見つけられない、もしくは空の文字列(@"")を指定した場合は{NSNotFound, 0}を返します

aString:検索する文字列(nilを指定することはできません)
(aStringがnilの場合、NSInvalidArgumentExceptionを呼び出します)

NSString *オブジェクト = @"Makoto73 Yayoi72 Chihaya72";
[オブジェクト rangeOfString:@"Chihaya"];    //    {17, 7}


・– rangeOfString:options:

– (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask

指定した文字列をオプション付きで検索し、最初に見つけた文字列の範囲を返します
指定した文字列が見つけられない、もしくは空の文字列(@"")を指定した場合は{NSNotFound, 0}を返します

aString:検索する文字列(nilを指定することはできません)
(aStringがnilの場合、NSInvalidArgumentExceptionを呼び出します)

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSBackwardsSearch、NSAnchoredSearch)を指定します
or演算子『|』で複数オプションを指定可能です

NSString *オブジェクト = @"Makoto73 Yayoi72 Chihaya72";
[オブジェクト rangeOfString:@"72" option:NSBackwardsSearch];    //    {24, 2}


・– rangeOfString:options:range:

– (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)aRange

指定した文字列を範囲とオプション付きで検索し、最初に見つけた文字列の範囲を返します
指定した文字列が見つけられない、もしくは空の文字列(@"")を指定した場合は{NSNotFound, 0}を返します

aString:検索する文字列(nilを指定することはできません)
(aStringがnilの場合、NSInvalidArgumentExceptionを呼び出します)

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSBackwardsSearch、NSAnchoredSearch)を指定します
or演算子『|』で複数オプションを指定可能です

aRange:検索範囲を指定します
元の文字列の範囲を超えてはいけません
(文字列を超える範囲を指定した場合、NSRangeExceptionで例外を発生させます)

NSString *オブジェクト = @"Makoto73 Yayoi72 Chihaya72";
[オブジェクト rangeOfString:@"72" option:NSCaseInsensitiveSearch range:NSMakeRange(0, 20)];    //    {14, 2}


・– rangeOfString:options:range:locale:

– (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(NSLocale *)locale

指定した文字列を範囲とオプション付きで検索し、最初に見つけた文字列の範囲を返します
指定した文字列が見つけられない、もしくは空の文字列(@"")を指定した場合は{NSNotFound, 0}を返します

aString:検索する文字列(nilを指定することはできません)
(aStringがnilの場合、NSInvalidArgumentExceptionを呼び出します)

mask:検索オプション(NSCaseInsensitiveSearch、NSLiteralSearch、NSBackwardsSearch、NSAnchoredSearch)を指定します
or演算子『|』で複数オプションを指定可能です

aRange:検索範囲を指定します
元の文字列の範囲を超えてはいけません
(文字列を超える範囲を指定した場合、NSRangeExceptionで例外を発生させます)

locale:検索文字列と比較するロケールを指定します(nilの場合、現在のロケールになります)
このlocaleでアルゴリズムのチェックをすることもできます
(例:トルコ語環境で大文字/小文字を区別しない条件の場合、『I』(U+0049:Latin Captal Letter I)は『i』(U+0069:Latin Small Letter I)だけでなく『ı』(U+0131:Latin Small Dotkess I)とも同一とみなされます)

NSString *オブジェクト = @"Chihaya72 Yayoi72 Makoto73";
[オブジェクト rangeOfString:@"72" option:NSBackwardsSearch locale:@"en_GB"];    //    {72, 2}

※ 検索と比較オプション(Search and Comparison Options)

NSCaseInsensitiveSearch1大文字と小文字を区別しません
NSLiteralSearch2(文字コードレベルで)文字が完全に一致するものを拾います
NSBackwardsSearch4文字列を文末から検索します
NSAnchoredSearch8文字列中、検索で最初にヒットした文字を拾います
(NSBackwardsSearchでは最後に相当) 
NSNumericSearch64文字列内の数字を数値として比較します
(比較メソッドのみ利用可)
(例:Foo2.txt < Foo7.txt < Foo25.txt)
NSDiacriticInsensitiveSearch128発音区別記号を無視します(例:『ö』と『o』は同じと扱います)
NSWidthInsensitiveSearch256東アジア文字集合における半角と全角を無視します
(例:『a』(U+FF41)と『a』(U+0061)は同じと扱います) 
NSForcedOrderingSearch512並べ替え要素を付加します
例えば、NSCaseInsensitiveSearchで同一と判別される
『aaa』と『AAA』の場合、『aaa』>『AAA』となります 

NSForcedOrderingSeachに関しては自分の訳が怪しいので原文を載せます。

Comparisons are forced to return either NSOrderedAscending or NSOrderedDescending if the strings are equivalent but not strictly equal.
This option gives stability when sorting. For example, “aaa” is greater than "AAA” if NSCaseInsensitiveSearch is specified.


●部分文字列の置換(Replacing Substrings)

・– stringByReplacingOccurrencesOfString:withString:

– (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement

targetの文字列をreplacementの文字列に全て置換し、新しい文字列を作ります

target:置換対象になる文字列を指定します
replacement:置換する文字列を指定します

NSString *オブジェクト1 = @"Chihaya:72";
NSString *オブジェクト2 = [オブジェクト1 stringByReplacingOccurrencesOfString:@"72" withString:@"91"]; 


・– stringByReplacingOccurrencesOfString:withString:options:range:

– (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange

指定した範囲とオプションで、targetの文字列をreplacementの文字列に全て置換し、新しい文字列を作ります

target:置換対象になる文字列を指定します

replacement:置換する文字列を指定します

options:置換対象の検索オプションを指定します(上記表『検索と比較オプション』参照)
(『0』を指定するとオプション無しになります)

searchRange:置換対象の検索範囲を指定します

NSStringCompareOptions opt = NSBackwardsSearch;
NSString *オブジェクト1 = @"Chihaya:72 Yayoi:72 Makoto:73";
NSString *オブジェクト2 = [オブジェクト1 stringByReplacingOccurrencesOfString:@"72" withString:@"91" options:opt range:NSMakeRange(0, 12)];    //    Chihaya:91 Yayoi:72 Makoto:73 


・– stringByReplacingCharactersInRange:withString:

– (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement

指定した範囲で文字列中の文字を置換して、新しい文字列を作ります

range:置換対象の検索範囲を指定します
replacement:置換する文字列を指定します

NSString *オブジェクト1 = @"Chihaya:72 Yayoi:72 Makoto:73";
NSString *オブジェクト2 = [オブジェクト1 stringByReplacingCharactersInRange:NSMakeRange(0, 7) withString:@"Mingosu"]; 



参考文献

NSString Class Reference

Cocoa APIとか(iPhoneとか)/NSString

Studying Cocoa/NSString

Wikipedia/Unicode一覧 0000-0FFF

RubyCocoaメモ/PDF文書内を検索する

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

商品詳細を見る

0 CommentsPosted in 資料

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 資料

NSString(1)

2010. 03. 26
iPhone SDKプログラミング大全』の『3−2 Foundationが提供する機能』で紹介しているクラスをピックアップしていきます。

まず最初はNSStringです。

●文字列の生成と初期化(Creating and Initializing Strings)

・+ string

+ (id)string

空の文字列を返します

NSString *オブジェクト = [NSString string];


- init

- (id)init

初期化した空のNSStringオブジェクトを返します

NSString *オブジェクト = [[NSString alloc] init];


・- initWithBytes:length:encoding:

- (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding

指定した長さとエンコーディングで初期化したバイト列をNSStringオブジェクトとして返します

bytes:文字列化するバイト列
length:バイト列の長さ
encoding:文字コードのエンコーディング

NSString *オブジェクト = [[NSString alloc] initWithBytes:バイト列 length:長さ encoding:NSUTF8StringEncoding];


・- initWithBytesNoCopy:length:encoding:freeWhenDone:

- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding
 
freeWhenDone:(BOOL)flag

指定した長さとエンコーディングで初期化したバイト列をNSStringオブジェクトとして返します。
またNSStringオブジェクト解放時に元のバイト列を解放するか選択できます。

bytes:文字列化するバイト列
length:バイト列の長さ
encoding:文字コードのエンコーディング
flag:YESの場合、NSStringオブジェクト解放時にバイト列を解放し、NOなら保持します

NSString *オブジェクト = [[NSString alloc] initWithBytes:バイト列 length:長さ encoding:NSShiftJISStringEncoding freeWhenDone:YES];


・– initWithCharacters:length:

– (id)initWithCharacters:(const unichar *)characters length:(NSUInteger)length

UnicodeのC配列から指定した文字数で初期化したNSStringオブジェクトを返します

characters:UnicodeのC配列(値がNULLの場合、例外が発生します)
length:C配列の長さ

NSString *オブジェクト = [[NSString alloc] initWithCharacters:C配列 length:長さ];


・– initWithCharactersNoCopy:length:freeWhenDone:

– (id)initWithCharactersNoCopy:(unichar *)characters length:(NSUInteger)length
 
freeWhenDone:(BOOL)flag

UnicodeのC文字列から指定した文字数で初期化したNSStringオブジェクトを返します。
またNSStringオブジェクト解放時に元のバイト列を解放するか選択できます。

characters:UnicodeのC配列(値がNULLの場合、例外が発生します)
length:C配列の長さ
flag:YESの場合、NSStringオブジェクト解放時にバイト列を解放し、NOなら保持します

NSString *オブジェクト = [[NSString alloc] initWithCharacters:C配列 length:長さ freeWhenDone:YES];


・– initWithString:

– (id)initWithString:(NSString *)aString

指定した文字列のコピーで初期化したNSStringオブジェクトを返します

aString:初期化に用いる文字列

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


・– initWithCString:encoding:

– (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding

NULLで終わるC文字配列を指定したエンコードで初期化したNSStringオブジェクトを返します
(C文字配列がNULL終端でない場合、またはエンコーディングが適切でない場合は未定義になります)

nullTerminatedCString:NULL終端のC文字配列
encoding:C文字配列のエンコーディング

NSString *オブジェクト = [[NSString alloc] initWithCString:"文字列" encoding:NSJapaneseEUCStringEncoding];


・– initWithUTF8String:

– (id)initWithUTF8String:(const)bytes

NULLで終わるUTF-8エンコーディングのC文字列のコピーで初期化したNSStringオブジェクトを返します
(NULL終端でない場合は例外が発生します)

bytes:UTF-8エンコーディングのNULL終端C文字列

NSString *オブジェクト = [[NSString alloc] initWithUTF8String:"文字列"];


・– initWithFormat:

– (id)initWithFormat:(NSString *)format ...

指定したフォーマット(書式)で初期化したNSStringオブジェクトを返します
formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

format:文字列の書式を指定します。nilを指定することはできません
...:カンマ区切りで値を指定します

NSString *オブジェクト = [[NSString alloc] initWithFormat:@"BST-%d-CHIHAYA", 72];


・– initWithFormat:arguments:

– (id)initWithFormat:(NSString *)format arguments:(va_list)argList

指定したフォーマットと可変引数リストで初期化したNSStringオブジェクトを返します
formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

format:文字列の書式を指定します。nilを指定することはできません
argList:可変引数リスト

va_list argList;
va_start(argList, 書式)
NSString *オブジェクト = [[NSString alloc] initWithFormat:書式 arguments:argList];
va_end(argList); 


・– initWithFormat:locale:

– (id)initWithFormat:(NSString)format locale:(id)locale ...

指定したフォーマットとロケールで初期化したNSStringオブジェクトを返します
formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

format:文字列の書式を指定します。nilを指定することはできません
locale:NSDictionaryかNSLocaleのインスタンスで指定し、nilの場合標準のロケールになります
ロケールの指定にdictionaryで環境設定から標準(デフォルト)のロケールを設定する場合は、[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]を使います

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
NSString *オブジェクト = [[NSString alloc] initWithFormat:書式 locale:locale, [NSDate date]];


・– initWithFormat:locale:arguments:

– (id)initWithFormat:(NSString *)format locale:(id)locale arguments:(va_list)argList

指定したフォーマットとロケール、可変引数リストで初期化したNSStringオブジェクトを返します
formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

format:文字列の書式を指定します。nilを指定することはできません
locale:NSDictionaryかNSLocaleのインスタンスで指定し、nilの場合標準のロケールになります
ロケールの指定にdictionaryで環境設定から標準(デフォルト)のロケールを設定する場合は、[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]を使います
argList:可変引数リスト

va_list argList;
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP";
va_start(argList, 書式)
NSString *オブジェクト = [[NSString alloc] initWithFormat:書式  locale:locale arguments:argList];
va_end(argList);


・– initWithData:encoding:

– (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

指定したエンコードで変換したデータで初期化したNSStringオブジェクトを返します

data:バイト列のNSDataオブジェクト
encoding:C文字配列のエンコーディング

NSString *オブジェクト = [[NSString alloc] initWithData:バイト列 encoding:NSUTF8StringEncoding];


・+ stringWithFormat:

+ (id)stringWithFormat:(NSString *)format,...

指定したフォーマットで作った引数リストの文字列を返します
formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

format:文字列の書式を指定します。nilを指定することはできません

NSString *オブジェクト = [NSString stringWithFormat:書式, 引数リスト];


・+ localizedStringWithFormat:

+ (id)localizedStringWithFormat:(NSString *)format ...

デフォルトのロケールで作った引数リストの文字列を返します
formatがnilの場合、NSInvalidArgumentExceptionを呼び出します)

format:文字列の書式を指定します。nilを指定することはできません

NSString *オブジェクト = [NSString localizedStringWithFormat:書式, 引数リスト];


・+ stringWithCharacters:length:

+ (id)stringWithCharacters:(const unichar *)chars length:(NSUInteger)length

UnicodeのC文字列から指定した文字数で作った文字列を返します

chars:UnicodeのC配列(値がNULLの場合、例外が発生します)
length:C文字列から使用する文字列の長さ

NSString *オブジェクト = [NSString stringWithCharacters:C配列 length:長さ];


・+ stringWithString:

+ (id)stringWithString:(NSString *)aString

指定した文字列のコピーで作った文字列を返します

aString:コピー元になるNSStringオブジェクトの文字列
(aStringがnilの場合、NSInvalidArgumentExceptionを呼び出します)

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


・+ stringWithCString:encoding:

+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc

C文字列を指定したエンコーディングで作り、返します
(C文字列がNULL終端でない、または指定したエンコーディングと実際のC文字列のエンコーディングが合っていない場合は結果が未定義になります)

cString:NULL終端のC文字列(途中にNULLが入っていてはいけません)
enc:C文字列のエンコーディング

NSString *オブジェクト = [NSString stringWithCString:"文字列", encoding:NSShiftJISStringEncoding];


・+ stringWithUTF8String:

+ (id)stringWithUTF8String:(const char *)bytes

UTF8エンコードのC文字列をコピーして作った文字列を返します

bytes:UTF-8エンコーディングのC文字列
(NULL終端でない場合は例外が発生します)

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



参考文献

Foundation Framework Reference

NSString Class Reference

Cocoa APIとか(iPhoneとか)/NSString

Studying Cocoa/NSString

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 資料

ロケールのリージョンコード

2010. 03. 25
- initWithFormat:locale:の引数で、ロケール(locale)が出てくるので説明します。

ロケールとは、国や地域ごとに合わせて言語や日付、通貨などを変える表記法のことです。

NSLocaleクラスの- initWithLocaleIdentifier:メソッドで、引数にリージョンコード(国・地域コード)を指定すると変更できます。

『言語名コード_国名コード』という形式になっており、言語名コードはISO 639、国名コードはISO 3166で定義されています。

リージョンコードはScript.hで定義されています。

アメリカverUS0 en_US 
フランスverFrance1Ffr_FR 
イギリスverBritain2Ben_GB 
ドイツverGermany3Dde_DE 
イタリアverItaly4Tit_IT 
オランダverNetherlands5Nnl_NL 
ベルギーverFlemish6FNnl_BE(オランダ語)
スウェーデンverSweden7Ssv_SE 
スペインverSpain8Ees_ES 
デンマークverDenmark9DKda_DK 
ポルトガルverPortugal10POpt_PT 
カナダverFrCanada11Cfr_CA(フランス語)
ノルウェーverNorway12Hnb_NO(ブークモール)
イスラエルverIsrael13HBhe_IL(ヘブライ語)
日本verJapan14Jja_JP 
オーストラリアverAustralia15Xen_AU(英語)
アラビア語verArabic16ABar北アフリカ、アラビア半島、レバント
のアラビア語
フィンランドverFinland17Kfi_FI 
スイスverFrSwiss18SFfr_CH(フランス語)
スイスverGrSwiss19SDde_CH(ドイツ語)
ギリシアverGreece20GRel_GR現代ギリシア語(1453年以降)
アイスランドverIceland21ISis_IS 
マルタverMalta22MAmt_MT 
キプロスverCyprus23CYel_CY(ギリシア語)
トルコverTurkey24TUtr_TR 
クロアチアverYugoCroatian25YUhr_HR旧ユーゴスラビア(クロアチア語)。
現在は68に移行
オランダverNetherlandsComma26  ID for KCHR resource - Dutch
フラマン語verFlemishPoint27  ID for KCHR resource - Belgium
カナダverCanadaComma28  ID for KCHR resource - Canadian ISO
カナダverCanadaPoint29  ID for KCHR resource – Canadian。
現在使用せず
ポルトガルvervariantPortugal30  ID for resource。現在使用せず
ノルウェーvervariantNorway31  ID for resource。現在使用せず
デンマークvervariantDenmark32  ID for KCHR resource。
デンマーク向けMac Plus
インドverIndiaHindi33 hi_IN(ヒンディー語)
パキスタンverPakistanUrdu34URur_PK(ウルドゥー語)
トルコverTurkishModified35 tr_TR(純化運動以降)
スイスverItalianSwiss36STit_CH(イタリア語)
汎用英語verInternational37Z en-ascii。国際的利用向け英語。
ASCII文字のみ
  38  未割り当て
ルーマニアverRomania39ROro_RO 
古代ギリシャ語verGreekAncient40   
リトアニアverLithuania41LTlt_LT 
ポーランドverPoland42PLpl_PL 
ハンガリーverHungary43MGhu_HU 
エストニアverEstonia44EEet_EE 
ラトビアverLatvia45LVlv_LV 
セルカップ語verSami46 se 
ノーフォーク島verFaroeIsl47FAfo_FO 
イランverIran48PSfa_IR(ペルシア語)
ロシアverRussia49RSru_RU 
アイルランドverIreland50GAga_IE 
大韓民国verKorea51KHko_KR 
中国verChina52CHzh_CN簡体字
台湾verTaiwan53TAzh_TW繁体字
タイverThailand54THth_TH 
汎用スクリプトverScriptGeneric55SS 汎用スクリプトシステム(非言語)
チェコverCzech56CZcs_CZ 
スロバキアverSlovak57SLsk_SK 
汎用東アジアverEastAsiaGeneric58FE 汎用東アジアシステム(非言語)
ハンガリーverMagyar59 hu_HU使用せず(verHungary参照)
ベンガル語verBengali60 bnバングラデシュまたはインド
ベラルーシverBelarus61BYbe_BY 
ウクライナverUkraine62UAuk_UA 
  63  未割り当て
ギリシア語verGreeceAlt64 el_GR (1453年以降)使用せず
セルビアverSerbian65SRsr_CSISO 3166-2では国名コードがRSに
なっています
スロベニアverSlovenian66SVsl_SI 
マケドニア共和国verMacedonian67MDmk_MK 
クロアチアverCroatia68CRhr_HR 
  69  未割り当て
ドイツ語verGermanReformed70  1996年の正書法改革以降に使用
(かつては未使用)
ブラジルverBrazil71BRpt_BR(ポルトガル語)
ブルガリアverBulgaria72BGbg_BG 
スペインverCatalonia73CAca_ES(カタルーニャ語)
多言語verMultilingual74ZMmul(非言語)
スコットランドverScottishGaelic75GDgd(ゲール語)
マン島語verManxGaelic76GVgv 
ブルトン語verBreton77BZ  
カナダverNunavut78IUiu_CA(イヌイット語)
ウェールズ語verWelsh79CU  
  80  80 is ID for KCHR resource
Canadian CSA(カナダ規格協会)
アイルランドverIrishGaelicScript81GSga-Latg_IE 
カナダverEngCanada82Ven_CA(英語)
ブータンverBhutan83BHdz_BT(ゾンカ語)
アルメニアverArmenian84HYhy_AM 
グルジアverGeorgian85KRka_GE 
ラテンアメリカverSpLatinAmerica86LAes_XL(スペイン語)
(private ISO 3166 code)
  87  87 is ID for KCHR resource
Spanish ISO
トンガverTonga88TSto_TO 
  89  89 is ID for KCHR resource
Polish Modified
  90  90 is ID for KCHR resource
Catalan ISO
汎用フランス語verFrenchUniversal91 fr 
オーストリアverAustria92AUde_AT(ドイツ語)
  93  verSpLatinAmericaの代替。使用せず
インドverGujarati94 gu_IN(グジャラート語)
パンジャーブ語verPunjabi95 paパキスタンまたはインド
インドverIndiaUrdu96 ur_IN(ウルドゥー語)
ベトナムverVietnam97 vi_VN 
ベルギーverFrBelgium98BFfr_BE(フランス語)
ウズベキスタンverUzbek99BDuz_UZ 
シンガポールverSingapore100SGen_SG(中国語やマレー語ではなく英語と
します)
ノルウェーverNynorsk101NYnn_NO(ニーノシュク)
南アフリカverAfrikaans102AKaf_ZA(アフリカーンス語)
エスペラント語verEsperanto103 eo 
インドverMarathi104 mr_IN(マラッタ語)
チベット語verTibetan105 bo 
ネパールverNepal106 ne_NP 
グリーンランドverGreenland107 kl 
アイルランドverIrelandEnglish108 en_IE(英語)

※ KCHR Resource:古い非Unicodeキーボードレイアウトのフォーマット



参考文献

NSLocale Class Reference

Unicode Utilities Reference

Wikipedia/ISO 639

Wikipedia/ISO 3166-1

Wikipedia/台湾

Wikipedia/トルコの言語純化運動

ドイツ国家検定通訳翻訳士のドイツ情報/ドイツ語のページ/ドイツ語概要

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

商品詳細を見る

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

0 CommentsPosted in 資料

可変引数リスト

2010. 03. 25
- initWithFormat:arguments:の引数で、可変引数リスト(va_list)が出てくるので説明します。

可変引数リストはC言語の機能で、引数の型や数が不定な場合に作るものです。

リストの作成はva_start()で始まり、va_arg()で引数を設定、va_end()で終わります。

・void va_start(va_list ポインタ, last)

リストの作成を開始します。

第2引数のlastは『引数リストの中で、可変部分の最後の引数名』です・・・といっても分かり難いので、補足します。

可変引数リストは、引数が何個あるか分からない(何個でも作れる)と同時に、どの型になるか分からない(異なる型を混在できる)代物です。

型(サイズ)が分からないのでva_listの中の人はポインタなのですが、何型のポインタか分からなければ作ることができません。

そのため、リストの最初の引数の型は必ず指定することになっています。
(可変引数リストとは言っても、最初の型だけは宣言時に固定されることになります)

宣言時の型がlastに入り、va_list(ポインタ)が作成され、その型の引数が1個目となります。

2個目以降は前回指定した型を元にポインタが移動してリストが形成されていきます。

・type va_arg(va_list ポインタ, type)

2個目以降の変数を指定します。

型は第2引数のtypeで指定できますので、条件分岐でva_arg()を複数設定し、異なる型の変数を作ることができます。

・void va_end(va_list ポインタ)

リストの作成を終了します。

void 関数(char *fmt, ...);
{
va_list ap;

va_start(ap, fmt);
...
引数 = va_arg(ap, 型);
...
va_end(ap);



参考文献

WisdomSoft/プログラミング/C言語入門/動的引数

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

商品詳細を見る

0 CommentsPosted in 資料

NSStringオブジェクトの書式

2010. 03. 24
- initWithFormat:の引数で、NSStringオブジェクトの書式が出てくるので説明します。

基本的にはC言語のprintfに準拠していますが、Objective-Cのオブジェクトを示す場合には『%@』を使う点が異なります。

書式
指定子
説明
%@文字列オブジェクト
%%『%』文字
%d、%D、%i符号有り32bit整数(int)
%u、%U符号無し32bit整数(unsigned int)
%hi符号有り16bit整数(short)
%hu符号無し16bit整数(unsigned short)
%qi符号有り64bit整数(long long)
%qu符号無し64bit整数(unsigned long long)
%x符号無し32bit整数(unsigned int)。16進数表記(0~9、a~f)
%X符号無し32bit整数(unsigned int)。16進数表記(0~9、A~F)
%qx符号無し64bit整数(unsigned long long)。16進数表記(0~9、a~f)
%qX符号無し64bit整数(unsigned long long)。16進数表記(0~9、A~F)
%o、%O符号無し32bit整数(unsigned int)。8進数表記
%f64bit浮動小数点実数(double)
%e64bit浮動小数点実数(double)。eを使った指数表記
%E64bit浮動小数点実数(double)。Eを使った指数表記
%g64bit浮動小数点実数(double)。 指数が−4以下の場合は%e、それ以外は%f
%G64bit浮動小数点実数(double)。 指数が−4以下の場合は%E、それ以外は%f
%c符号無し8bit文字(unsigned char)。NSLog()でASCII文字として出力。
ASCII文字でない場合、8進数の\\dddかUnicode 16進数の\\uddddで出力
%C16bit Unicode文字(unichar)。NSLog()でASCII文字として出力。
ASCII文字でない場合、8進数の\\dddかUnicode 16進数の\\uddddで出力
%sNULL終端の符号無し8bit文字配列
%SNULL終端の16bit Unicode文字配列
%pvoid型ポインタ(void *)。16進数表記で0xの後に0~9、a~fと出力
%L%a、%A、%e、%E、%f、%F、%g、%Gの長さをlong double型に調整します
%a64bit浮動小数点実数(double)。pを使った指数表記
%A64bit浮動小数点実数(double)。Pを使った指数表記
%F64bit浮動小数点実数(double)。10進数表記
%z%d、%i、%o、%u、%x、%Xの長さをsize_t型かunsigned int型に調整します
%t%d、%i、%o、%u、%x、%Xの長さをptrdiff_t型かunsigned int型に調整します
%j%d、%i、%o、%u、%x、%Xの長さをintmax_t型かuintmax_t型に調整します

●p(P)を使った指数表記

%a、%Aの、『p(P)を使った指数表記』はよく分かりませんでした。
(10進数の小数の前に、0xで始まる1桁の16進数で指数を表すという感じなのですが、英語が不得手なので合っているかどうか・・・)

●size_t型

%zのsize_t型はメモリのバイト数を表す型で、stddef.hで定義されています。

#define __SIZE_TYPE__ long unsigned int
typedef __SIZE_TYPE__ size_t;

●ptrdiff_t型

%tのptrdiff_t型はポインタの演算結果を表す型で、stddef.hで定義されています。

#define __PTRDIFF_TYPE__ long int
typedef __PTRDIFF_TYPE__ ptrdiff_t;

●intmax_t/uintmax_t型

%jのintmax_t/uintmax_t型は最大値の整数型で、stdint.hで定義されています。

typedef long long                intmax_t;
typedef unsigned long long      uintmax_t;



参考文献

String Programming Guide for Cocoa

Cocoa APIとか(iPhoneとか)/initWithFormat

法政大学 経済学部 奥山研究室/コンピュータ; UNIX, シェル, C言語/C言語

seclanのほえほえルーム/宝箱/新C言語/プログラミング言語Cの新機能

0 CommentsPosted in 資料

文字コードのエンコーディング

2010. 03. 23
前回の『バイト列』でも触れましたが、- initWithBytes:length:encoding:の2つ目の引数でも出てくる文字コードのエンコーディングについて紹介していきたいと思います。
(説明は私の能力ではできませんので、参考文献を参照してください)

『文字コードはコンピュータで文字を表現する際に割り振られた番号』と話しました。

しかし色々あって同じ言語でも複数の文字コードが存在しており、日本語だけでもUTF-8、Shift-JIS、EUCなど、標準化団体や業界、ベンダごとに分類すれば数十種類あります。

ここではiPhone OSが提供している文字コードを紹介します。

NSASCIIStringEncoding17bit ASCIIエンコーディング
NSNEXTSTEPStringEncoding2NEXTSTEP拡張8bit ASCIIエンコーディング
NSJapaneseEUCStringEncoding3日本語8bit EUCエンコーディング
NSUTF8StringEncoding4UTF-8エンコーディング
NSISOLatin1StringEncoding58bit ISO Latin 1エンコーディング
NSSymbolStringEncoding68bit Adobe Symbolエンコーディング
NSNonLossyASCIIStringEncoding7損失無し7bit ASCIIエンコーディング
NSShiftJISStringEncoding8日本語8bit Shift-JISエンコーディング
NSISOLatin2StringEncoding98bit ISO Latin 2エンコーディング
NSUnicodeStringEncoding10UTF-16エンコーディング
NSWindowsCP1251StringEncoding11キリル文字エンコーディング
NSWindowsCP1252StringEncoding12Win Latin 1エンコーディング
NSWindowsCP1253StringEncoding13ギリシャ語エンコーディング
NSWindowsCP1254StringEncoding14トルコ語エンコーディング
NSWindowsCP1250StringEncoding15Win Latin 2エンコーディング
NSISO2022JPStringEncoding21日本語ISO 2022エンコーディング(JISコード)
NSMacOSRomanStringEncoding30Classic Macintosh Romanエンコーディング
NSUTF16StringEncoding-UTF-16エンコーディング
(NSUnicodeStringEncodingの別名)
NSUTF16BigEndianStringEncoding0x90000100ビッグエンディアンUTF-16エンコーディング
NSUTF16LittleEndianStringEncoding0x94000100リトルエンディアンUTF-16エンコーディング
NSUTF32StringEncoding0x8c000100UTF-32エンコーディング
NSUTF32BigEndianStringEncoding0x98000100ビッグエンディアンUTF-32エンコーディング
NSUTF32LittleEndianStringEncoding0x9c000100リトルエンディアンUTF-32エンコーディング

エンディアンについては『スマッシュを作ってみた(1)』にちょこっと説明があります。

上の表を種類別に分けると下表のようになります。

ASCII7bitNSASCIIStringEncoding
NSNonLossyASCIIStringEncoding
独自拡張NSNEXTSTEPStringEncoding
NSMacOSRomanStringEncoding
Unicode8bitNSUTF8StringEncoding
16bitNSUnicodeStringEncoding
NSUTF16StringEncoding
NSUTF16BigEndianStringEncoding
NSUTF16LittleEndianStringEncoding
32bitNSUTF32StringEncoding
NSUTF32BigEndianStringEncoding
NSUTF32LittleEndianStringEncoding
EUC-JPNSJapaneseEUCStringEncoding
ISO/IEC 8859NSISOLatin1StringEncoding
NSISOLatin2StringEncoding
AdobeNSSymbolStringEncoding
Shift-JISNSShiftJISStringEncoding
ISO-2022-JPNSISO2022JPStringEncoding
WindowsコードページNSWindowsCP1251StringEncoding
NSWindowsCP1252StringEncoding
NSWindowsCP1253StringEncoding
NSWindowsCP1254StringEncoding
NSWindowsCP1250StringEncoding

※2010.3.24訂正
『ISO/IEC 8859』の『NSISOLatin2StringEncoding』のところを『NSWindowsCP1250StringEncoding』にしていました。申し訳ありません。

日本語の扱いに関して、クローズドなアプリケーションならUTF-8を使っていれば問題無いと思いますが、ブラウザやメールなど、他のエンコーディングのファイルを取り扱う際には注意が必要となります。



参考文献

NSString Class Reference

Wikipedia/文字コード

Wikipedia/ASCII

Wikipedia/拡張ASCII

Wikipedia/Unicode

Wikipedia/UTF-8

Wikipedia/UTF-16

Wikipedia/UTF-32

Wikipedia/EUC-JP

Wikipedia/ISO/IEC 8859-1

Wikipedia/Shift_JIS

Wikipedia/ISO-2022-JP

Wikipedia/Windows-1252

0 CommentsPosted in 資料

バイト列

2010. 03. 23
NSStringクラスのまとめをしているんですが、メソッドが121個もある時点でうんざりしちゃったり、引数についての解説も必要だったりと、途方に暮れています。

一通りまとめてから公開しようとすると何日も間が空きそうなので、穴埋めに引数で出てくる用語の解説をしていきたいと思います。

まずは、- initWithBytes:length:encoding:で出てきた『バイト列』から。

●『バイト列』で検索してみる

『バイト列』で検索してみますと、あまりに当たり前の用語のせいか、文中の用語として引っかかるだけで、そのものに対する解説がなかなか出てきません。

強いて言えば、

・byte型データの配列
@IT/.NET TIPS/文字列をシフトJISとしてバイト列に変換するには?
・数値の列
IT用語辞典/UTF-8とは

つまり、『バイト列 = バイト配列 = バイト型配列』というわけですね。

同じ物なのに呼称が違うのはよくある話で、このサイト内でも英語とカタカナが入り乱れていますが・・・(申し訳ないとは思ってますが諦めてください)

●『バイト型』でぐぐってみる

さて、次は『バイト型』って何?となりまして、

・0から255までの符号無し8ビット(1バイト)の整数です
msdn/Visual Basicデベロッパーセンター/バイト型

よりによってMicrosoftに頼るとは・・・と思う人も最近は少ないでしょうが、Microsoftが成功したのはVisual Basicなど未経験開発者に対して敷居が低かったからだという気がします。

Macはユーザフレンドリーではありますが、Objective-C言語というマイナー言語という点を差し引いても、開発者に優しいというイメージがあまりありませんからね。

それは今現在の私が実証しているように、iPhoneアプリケーションを作ろうとすると、

・iPhoneアプリの入門書を読む → Objective-C言語の知識が必要
・Objective-C言語の入門書を読む → C言語の知識が必要
・C言語の入門書を読む

とたらい回しにされる点に現れていると思います。

しかも色々な資料を探すほど、『バイト列』のように用語の表記揺れがあったり、用語自体を調べ回ることになり、元々何の勉強をしていたのか分からなくなります。

閑話休題。

8ビットの値は16進数(0~9、A~F)で表記すると2桁で表せます(0x00~0xFF)。
(参照:睡人亭/文字コード入門/コンピュータ上での数値の扱い

つまり、

・バイト型は『0x00~0xFF』という値を取る
・バイト列はバイト型の値を格納する配列

ということになります。(多分)

●文字コード

数値や文字列の配列であれば、データベースのような使い方がすぐ浮かびます。

バイト列は定義だけ聞くと素人には使い道が思い浮かびませんが、ここで出てくるのが文字コードというものです。

ASCII、Unicode、Shift-JISなどなど、Safariでいうテキストエンコーディングのことで、コンピュータで文字を表す際に各文字に番号を割り振ったものです。

エンコーディングは『コード化する』の意味です。

どの文字にどんなコードが割り振られているかを確認する方法としては、『ことえり』ですと、

・『ことえり』のプルダウンメニュー、または環境設定で『言語とテキスト』を開く
・『入力ソース』で『キーボードビューアと文字ビューア』にチェックを入れる
・『ことえり』のプルダウンメニューで『文字ビューアを開く』を選択

すると文字ビューアが開きます。

下の検索欄に一文字入力し、左上の表示メニューで『コード表』を選択すると、文字コードが表示されます。

208

 
Unicode534365E9
UTF8E5 8D 83E6 97 A9
Shift JIS90E79181

このようにエンコーディングによって、同じ文字でも割り振られているコードが異なります。

ブラウザで文字化けする原因は、作ったファイルと表示するブラウザのエンコーディング設定が異なっているために、別の文字と認識してしまうことが原因です。

●バイト列の使い道

ブラウザなどで拾ってきたファイルを表示しようとする場合、ファイルを開くと中身は生データ、つまりバイト列となっています。

ファイルの中身を文字として認識させて表示したり加工したりするには、バイト列を文字または文字列に変換する必要があります。

また日本語のような多バイト文字(マルチバイトともいう、1バイト=256種で表現しきれない言語)を表示するには、エンコーディングを指定しなければなりません。

そのためのメソッドがNSStringクラスに有ります(やっと繋がった)。

0 CommentsPosted in 資料

FoundationとCore Foundation(4)

2010. 03. 20
Foundation Framework Reference』のIntroductionのFigure I-1  Cocoa Objective-C Hierarchy for Foundationに沿ってカテゴリ別に軽く説明を・・・と思いましたが、案外日本語の資料が乏しく断念しました。

英語も分からない上に基盤となる知識が乏しく、自分で訳した合ってるかどうか分からない説明を載せるのも問題なので、どうかご容赦ください。

一日半潰して何も無いのも悔しいので、FoundationとCore Foundationの対応表と、役立ちそうな参考サイトだけでも上げておきます。

●数値と日付と時間(Value Objects)

FoundationCore Foundation
NSCalendarCFCalendar
NSDataNSMutableDataCFDataCFMutableData
NSDateCFDate
NSDateComponents-
NSDecimalNumberHandler-
NSLocaleCFLocale
NSNullCFNull
NSTimezoneCFTimeZone
NSValueNSNumberNSDecimalNumber-CFNumber-
NSValueTransformer-

●XML

Foundation
NSXMLParser


●文字列(Strings)

FoundationCore Foundation
NSCharacterSetNSMutableCharacterSetCFCharacterSetCFMutableCharacterSet
NSStringNSMutableStringCFStringCFMutableString
NSFormatterNSDateFormatter-CFDateFormatter
NSNumberFormatterCFNumberFormatter
NSScanner-
NSSortDescriptor-

●コレクション(Collections)

FoundationCore Foundation
NSArrayNSMutableArrayCFArrayCFMutableArray
NSDictionaryNSMutableDictionaryCFDictionaryCFMutableDictionary
NSEnumeratorNSDirectoryEnumerator--
NSIndexPath-
NSIndexSetNSMutableIndexSet--
NSSetNSMutableSetNSCountedSetCFSetCFMutableSet-

●Predicates(抽出条件)

Foundation
NSExpression
NSPredicateNSComparisonPredicate
NSCompoundPredicate

●OSサービス(Operating-System Services)

FoundationCore Foundation
NSErrorCFError
NSNetService-
NSNetServiceBrowser-
NSProcessInfo-
NSRunLoopCFRunLoopCFRunLoopTimer
NSTimer-
NSUserDefaults-

※2010.4.13修正
CFRunLoopTimerがNSTimerに関連付けられていたので、CFRunLoopに修正しました

●ファイル管理(File System)

FoundationCore Foundation
NSBundleCFBundle
NSFileHandle-
NSFileManager-
NSStreamNSInputStream-CFReadStream
NSOutputStreamCFWriteStream

●URL

FoundationCore Foundation
NSCachedURLResponse-
NSHTTPCookie-
NSHTTPCookieStorage-
NSURLCFURL
NSAuthenticationChallenge-
NSURLCache-
NSURLConnection-
NSURLCredential-
NSURLCredentialStorage-
NSURLProtectionSpace-
NSURLProtocol-
NSURLRequestNSMutableURLRequest--
NSURLResponseNSHTTPURLResponse--

●プロセス間通信(Interprocess Communication)

Foundation
NSPipe
NSPortNSMachPort 
NSMessagePort

●スレッド制御(Locking/Threading)

Foundation
NSConditionLock
NSLock
NSOperationNSInvocationOperation
NSOperationQueue
NSRecursiveLock
NSThread

●通知(Notifications)

FoundationCore Foundation
NSNotification-
NSNotificationCenterNSDistributedNotificationCenterCFNotificationCenter-
NSNotificationQueue-

●アーカイブとシリアライズ(Archiving and Serialization)

Foundation
NSCoderNSKeyedArchiver
NSKeyedUnarchiver
NSPropertyListSerialization

●Objective-C言語サービス(Objective-C Language Service)

Foundation
NSAssertionHandler
NSAutoreleasePool
NSException
NSInvocation
NSMethodSignature
NSUndoManager



参考文献

Foundation Framework Reference

Cocoaリファレンス日本語化計画

Studying Cocoa

Cocoa APIとか(iPhoneとか)

Cocoa基礎ガイド

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)
荻原 剛志

商品詳細を見る

Calendar
02 | 2010/03 | 04
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
Wish List
iOS/iPadOS Devices
Twine
Twine Reference
1. 序章
2. はじめに
2.1. Twineのインストール
2.2. 基本コンセプト
2.3. Twineを使いこなす
2.4. Twineのアップデート
2.5. Twineのアンインストール
2.6. Twineの古いバージョンを使う
3. ストーリーライブラリを使う
3.1. ストーリーの表示
3.2. ストーリーの作成、コピー、インポート
3.3. ストーリーの編集
3.4. ストーリー名の変更
3.5. ストーリーのアーカイブとエクスポート
3.6. ストーリーの削除
3.7. ストーリーへのタグ付け
3.8. ライブラリの場所を変更する
4. ストーリーの編集
4.1. ストーリーマップのナビゲーション
4.2. 取り消しとやり直し
4.3. パッセージの選択と移動
4.4. パッセージの編集
4.5. パッセージのリンク
4.6. パッセージの削除
4.7. パッセージのタグ付け
4.8. テキストの検索と置換
4.9. ストーリー名の変更
4.10. ストーリーフォーマットの変更
4.11. ストーリーの統計の表示
4.12. ストーリーのJavaScriptとCSSを編集する
5. 作品の公開出力
5.1. ストーリーのテスト
5.2. ストーリーの校正
5.3. ストーリーのプレイ
5.4. ストーリーの公開出力
5.5. スクラッチフォルダ
6. ストーリーフォーマットの管理
6.1. ストーリーフォーマットの表示
6.2. デフォルトのストーリーフォーマットの変更
6.3. 校正フォーマットの変更
6.4. ストーリーフォーマットの追加
6.5. ストーリーフォーマットの削除
6.6. ストーリーフォーマットの拡張機能を無効にする
6.7. Twineがストーリーフォーマットのバージョンを管理する方法
7. Twineのカスタマイズ
7.1. 環境設定の設定
7.2. コマンドラインスイッチ
7.3. 高度なカスタマイズ
8. 制限事項
8.1. 大きなストーリー
8.2. ストーリーの組み合わせ
8.3. ストーリーの共同編集
8.4. 画像とマルチメディアの使用
8.5. ソースコントロールでの作業
9. 問題のトラブルシューティング
9.1. バックアップ
9.2. ローカルストレージの直接表示
9.3. 編集中にエラーメッセージが表示される場合
9.4. Twineが起動しない場合
9.5. Twineがあなたのストーリーを失ったら
9.6. ストーリーが破損している場合
9.7. Twineの外観に不具合がある場合
10. リリースノート
10.1. バージョン 2.8
10.2. バージョン 2.7
10.3. バージョン 2.6
10.4. バージョン 2.5
10.5. バージョン 2.4
10.6. バージョン 2.3
10.7. バージョン 2.2
10.8. バージョン 2.1
10.9. バージョン 2.0
10.10. バージョン 1.0
10.11. Tweebox バージョン

Twine Cookbook
詳解Swift
詳解Swift第5版(01)〜Swiftでプログラミング
詳解Swift第5版(02)〜関数
詳解Swift第5版(03)〜構造体
詳解Swift第5版(04)〜オプショナル
詳解Swift第5版(05)〜プロトコル
詳解Swift第5版(06)〜基本的なデータ型
詳解Swift第5版(07)〜パターン
詳解Swift第5版(08)〜クラスと継承
詳解Swift第5版(09)〜メモリ管理
詳解Swift第5版(10)〜拡張
詳解Swift第5版(11)〜エラー処理
詳解Swift第5版(12)〜クロージャ
詳解Swift第5版(13)〜ジェネリクス
詳解Swift第5版(14)〜メモリへのアクセスとポインタ
詳解Swift第5版(15)〜カスタム属性とDSL記法
詳解Swift第5版(16)〜GUI との連携

詳解Swift第4版(01)〜Swiftでプログラミング
詳解Swift第4版(02)〜関数
詳解Swift第4版(03)〜構造体
詳解Swift第4版(06)〜基本的なデータ型
詳解Swift第4版(07)〜パターン
詳解Swift第4版(08)〜クラスと継承
詳解Swift第4版(09)〜メモリ管理
詳解Swift第4版(10)〜拡張
詳解Swift第4版(11)〜エラー処理
詳解Swift第4版(12)〜クロージャ
詳解Swift第4版(13)〜ジェネリクス

詳解Swift第3版(01)〜Swiftでプログラミング
詳解Swift第3版(02)〜関数
詳解Swift第3版(03)〜構造体
詳解Swift第3版(05)〜基本的なデータ型
詳解Swift第3版(06)〜パターン
詳解Swift第3版(07)〜演算子
詳解Swift第3版(08)〜クラスと継承
詳解Swift第3版(09)〜メモリ管理
詳解Swift第3版(10)〜プロトコル
詳解Swift第3版(11)〜拡張
詳解Swift第3版(12)〜エラー処理
詳解Swift第3版(13)〜クロージャ
詳解Swift第3版(14)〜ジェネリクス

詳解Swift改訂版(01)〜Swiftでプログラミング
詳解Swift改訂版(02)〜関数
詳解Swift改訂版(03)〜構造体
詳解Swift改訂版(04)〜オプショナル
詳解Swift改訂版(05)〜基本的なデータ型
詳解Swift改訂版(06)〜パターン
詳解Swift改訂版(07)〜演算子
詳解Swift改訂版(08)〜クラスと継承
詳解Swift改訂版(09)〜メモリ管理
詳解Swift改訂版(10)〜プロトコル
詳解Swift改訂版(11)〜拡張
詳解Swift改訂版(12)〜エラー処理
詳解Swift改訂版(13)〜クロージャ
詳解Swift改訂版(14)〜ジェネリクス

詳解Swift(1)〜Swiftでプログラミング
詳解Swift(2)〜関数
詳解Swift(3)〜構造体
詳解Swift(4)〜オプショナル
詳解Swift(5)〜基本的なデータ型
詳解Swift(6)〜パターン
詳解Swift(7)〜演算子
詳解Swift(8)〜クラスと継承
詳解Swift(9)〜メモリ管理
詳解Swift(10)〜プロトコル
詳解Swift(11)〜拡張
詳解Swift(12)〜クロージャ
詳解Swift(13)〜ジェネリクス
詳解Swift(14)〜C/Objective-Cとのデータ受け渡し
Swift
Site Map
Apple Music


Categories
Tips
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
QR Code
QR
Profile

水月杏香

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

Visitors