忍者ブログ
natsuの秘密基地です
はまり
はまり一件ごとのお話の流れです
カレンダー
03 2024/04 05
S M T W T F S
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
プロフィール
HN:
natsu
性別:
男性
趣味:
酒など
自己紹介:
ここに書かれていることはフィクションです。
ブログ内検索
アクセス解析
[1] [2] [3] [4
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

すでになにか別の処理で、
テキストファイルからテキストをメモリに読み取ってあるのなら、
stringWithCString:encodingを使えば、
そのメモリ領域にあるデータからNSStringを作成できると思った。
 
私の場合、encodingについては既に割れているので、
それを引数にstringWithCString:encodingを使う。
 
 
らくちんぽん。とおもいきや。
 
 
UTF-16でどうもうまくいかない。
 
ん?こいつどうやってUTF-16の終端を判断してるんだ?
とおもった。
長さを渡していないので、
終端を表す何かが必要なはず。
 
UTF-16でASCII文字を使うと、1バイト分データの空きが出る。
そう。そこはヌル文字。
なので、ほかの文字列と同じようには
UTF-16ではヌル文字で終端を表せない。
2バイト連続ヌル文字を使えばいいのだろうけど、
そんな話は聞いたこと無い。
ちなみにやってみたけど駄目。


 
unicharの配列だと可能だろうけど、
stringWithCStringはふつうにcharの配列を受け取るから。
 
もし、stringWithCString:encoding内部で、
ヌル文字を終端として扱っているなら、
このメソッドではUTF-16は扱えないように思えた。
 
 
そんななかにもかすかな光が。
 
 
stringWithCString:length:は長さが指定できる。
そして、試したところBOM無しのリトルエンディアンUTF-16も
同様にBOM無しのビッグエンディアンUTF-16もちゃんと読み込めた。
 
ん?Deprecated in Mac OS X v10.4?
あ。自分、英語読めませんのですいませんが。
 
 
なんか光が消えた。
 
 
そんななかにもかすかな光が。
 
 
stringWithCharacters:length:というメソッドがある。
引数にconst unichar *と長さが渡せる。
 
もう。いかにもいけそうな予感。


 
結論から言うといける。
ビッグエンディアンなら。

リトルエンディアンのときはBOMをつけてもだめ。
んもー。またぐちゃぐちゃ。
 
 
あー。なんならスワップしますけど、します?
 
 
またもや、そんななかにもかすかな光が。
 
 
initWithBytes:length:encoding:というメソッドがあった。
長さもエンコードも指定できる。
ええんよ、ええんよ。
どっちもわかってるから。
ちゃんと動いてくれれば。
 
...
動いた!
 
 
えっと。クラスメソッド版は無いんですね...
allocしなきゃだめですか。
 
 
そうですか。
 
PR
ある意味で、ある文章から特定の文字列を
抜き出さなければならないという仕事は、
いつだってある仕事なのだと思う。
 
従って、「ある意味で」という言葉を文書から検索し、
その位置を導きだすこというサンプルは、
ある意味、非常に有益だと思う。
 
 
管さんはある意味でを使い過ぎらしい。
ある意味で。
 
 
これまで、なんか重い話題が続いたので、
ある意味ちょっと息抜きで。
 
 
レッツrangeOfString:options。
 
 
第一引数で検索したい文字列を指定。
私の場合、@"ある意味で"。
 
第二引数はオプション。
実際はunsigned int。
オプションは適宜指定で。
まずは無しで検索してみたいの私は0で。
 
 
戻り値のNSRangeはlocationとlengthを持つ構造体。
NSLog(@"location : %d   length : %d", range.location, range.length);
とかやれば値が見れる。
 
locationは先頭の文字を0として、
多バイト文字でも文字数で何文字目か出してくれる。
lengthも文字数。
 
 
 
私の場合、「ある意味で」が2回登場するので、
もう一回やる必要がある。
ふつう2回出る、なんて知らないので、
do whileで回す必要がある。
そんなとき、rangeOfString:options:range:。
第三引数で、残りの部分を指定してやればいい。
 
range= NSMakeRange(0, 0);
result = NSMakeRange(0, 0);
do
{
range.location = result.location+result.length;
range.length = [base length] - (result.location+result.length);
 
result = [base rangeOfString:@"ある意味で" options:0 range:range];
if(result.location != NSNotFound)
NSLog(@"location : %d   length : %d", result.location, result.length);
 
}while(result.location != NSNotFound);
 
 
 
 
オプションについてはunsigned intなんで、
cのノリで
NSCaseInsensitiveSearch | NSLiteralSearch
とかしちゃえばOK。
 
 
例えばこんなオプションがありんす。
 
 
NSCaseInsensitiveSearch
大文字小文字を区別しない。

 
NSLiteralSearch
これを指定した場合、byteをみて比較する。

 
例えば、UCS2で3071,306F,309Aとした場合、
それは"ぱぱ"となる。
3071が"ぱ"。
306Fが"は"。
309Aが"゜"
"ぱは゜"ではなく、だいたいちゃんと"ぱぱ"と表示される。
このオプションを指定すると、
3071の"ぱ"で検索した場合、
306F,309Aの"ぱ"で引っかからなくなる。
 
 
NSBackwardsSearch
終わりから検索。
エディタの"前を検索"を実装するときに使うんだろうなと。
 
 
NSAnchoredSearch
先頭しか検知しない。
(NSBackwardsSearchのときは最後)
 
 
NSNumericSearch
文字列に含まれる数値で比較。
たぶん、compare:optionsとか使うときに使う。
 
 
NSDiacriticInsensitiveSearch
発音区別符号無視。
無視すると、'ö’は‘o'で検索に引っかかる。
試してないけど。
 
 
NSWidthInsensitiveSearch
全角aが半角aとマッチするようになる。
半角aもまた全角aとマッチするようになる。

 
NSForcedOrderingSearch
compare:optionsとかで使えるんだと思う。
こいつは言ってることがよくわかんなかった。
NSCaseInsensitiveSearch指定で"aaa"<"AAA"らしい。
 


 
NSCaseInsensitiveSearchとNSLiteralSearchが大事なんだと思う。
 
いわゆるJISなんですが。
 
 
ルール1
漢字や半角カタカナとかの前にあるコードをおくこと。
そのコードは0x1B(いわゆるエスケープ文字)から始まる。
 
ルール2
漢字や半角カタカナを使い終わったら、あるコードをおき、
行の終わりまでにJIS X 0201-1976のラテン文字集合か
ASCIIに戻すこと。
 
 
っていうことがあるみたいなんで、
そんなコード。
 
例えば、
1B 24 42
とか、
1B 28 42
が入っていれば
JISと思えばいいんすよ。
 
 
ただ、これはUCS2に含まれているようなコードで、
すなわちそれはUTF-16で書かれている以下のような文字列、
 
☛⑂あかさたなはまやらわ✛⡂
 
なんかはJISっぽく見えるんだと思う。
まあ、こんな文字列はね。
見かける可能性なんてないと思うけど。
 
あるわけないよこんなの。
 
 
だから、
 
☛⑂⡂やっほー。元気ー? こないだの品物は1200㌛⡂⑂☚
 
っていうUTF-16の文章は悪意があるんだよ。
うっさい。具合悪いわ!みたいな。
円で換算してから請求しろ!!みたいな。
 
 
Windowsのブラウザでちゃんと出るのか不安だ。
 
 
1B 2?はバリのほうの言葉が割り当てられてるんで、
バリのほうの文書はJISっぽいんだと思った。
 
ちなみに、
☛ 26 1B 右さしてる手の形。しかも黒い
⑂ 24 42 さすまたみたいな記号。
✛ 27 1B 十字な記号。
⡂ 28 42 クリリンのおでこにあるようなやつ。
㌛ 33 1B クローネを一文字で。
だわさ。
 
 
クリリンのおでこは、
ハードウェアな人が使いそうな予感。
 


 
Windowsのブラウザでちゃんと出るのか激しく不安だ。



ここらあたりは文字化け御免で。


 
そんなこんなで、ちょっと怖いよね。
だもんで、UTF-16チェックをした後に
JISチェックをするようにしようと思った、
今日という肌寒い日。
 


 
どっか雹がふってたらしいよ。
 


Copyright (C) 2010 NEST,
All right Resieved.*Powered by ニンジャブログ *Designed by にこるん  / 忍者ブログ / [PR]