投稿

2月, 2013の投稿を表示しています

NSStringいろいろ

NSStringについてのいろいろ。
記事を書いた時のiOSバージョンはiOS6.1.3です。

初期化時の複数バイトエンコーディングの扱い
- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
は引数にencodingがあるが、複数バイトエンコーディングのものを指定すると、全て0となっているバイトで文字列末端とみなされるようだ。
例えば2バイトで
00000000 10101010
と表される文字があるとすると00000000のバイトを文字列末端とみなすらしい。
長い文字列のはずが、いきなり初めのほうで文字列が終わってしまう。
+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc
も同様。
上位8ビットが0の時だけでなく下位8ビットが0の時でも末端と見るようだ。

おそらく
8ビット毎に取り出して
char selectedChar = 取り出し関数(); if(selectedChar == 0){ 末端処理 }else{ switch(エンコード){ 各エンコード別の処理 } } のような処理だ。

そもそも8ビットの0を内部に含むエンコーディングはC言語文字列の定義から外れるという考え方なんだろう。

対策は
– initWithBytes:length:encoding:(これはどのエンコードでもいけそう)
- initWithCharacters:length:(UTF-16限定?)
+ stringWithCharacters:length:(UTF-16限定?)
などを使う。

第3水準、第4水準の漢字に対応しているか
まず、漢字の分類方法なのだが、第1、第2、第3、第4とあり、数字が大きいほうに使用頻度の低い漢字が割り当てられている。
第4水準の初めの文字は「毎」のカンムリだけを取り出したようなもの。読み方はわからず。このブログでは表示出来ない。
で、この漢字をiOSで扱えるのか?
Unicodeに含まれていれば対応しているんではないか?と思うかもしれない。
それは確かにそうなのだが、ときどきUnicode以外のエ…

Unicodeについて

Unicodeで日本語が該当する箇所
Unicodeの中で日本語が該当する所を調べてみました。
漢字は基本的に、日本語で使われるか中国語で使われるかは区別されません。ですからこれらの範囲の中には中国でしか使われない漢字も含まれています。
ここでは割り当てられている領域を書いています。実際に文字が割り当てられている範囲が書かれている資料とは終わりの値が若干異なることがあります。

ひらがなU+3040~U+309F(ひらがな文字は U+3041~U+3096)
カタカナU+30A0~U+30FF(カタカナ文字はU+30A1~U+30FA)
「CJK統合漢字」U+4E00~U+9FFFに、約20,000字
「CJK統合漢字拡張A」U+3400~U+4DBFに、6,500字強
「CJK統合漢字拡張B」U+20000~U+2A6DFに、約42,000字
「CJK統合漢字拡張C」U+2A700~U+2B73F(2009年10月制定のUnicode5.2.0)
「CJK統合漢字拡張D」U+2B740~U+2B81F(2010年10月制定のUnicode6.0)

また、一覧の中から私が目視で日本語ぽいと判断したものに
U+2E80-2EFF CJK部首補助
U+2F00-2FDF 康熙部首
U+3000-303F CJKの記号及び句読点
U+31F0-31FF 片仮名拡張
U+3200-32FF 囲みCJK文字・月
U+3300-33FF CJK互換用文字
U+FE30-FE4F CJK互換形(たてがき?)
U+FE50-FE6F小字形(たてがき?)
U+FF00-FFEF半角・全角形
があります。

漢字ではこれらの「CJK統合漢字」や「CJK統合漢字拡張A~D」とは別に、
U+F900~U+FAFFとU+2F800~U+2FA1Fに「互換漢字」
U+E0100〜U+E01EFにIVS用のバリエーション符号
があります。

Objective-CでのUnicode文字列の扱い
iOSの文字列の文字コードはUnicodeです。Unicodeには表現方法がいくつかあって、おそらく、UTF-16という方法を用いていると思います。(はっきりした資料が見当たらず予想という前程)
このUTF-16はほとんどの文字を2バイトで表現しますが一部の文字を4バイトで表現します。
困ったことに、NSS…

konashi 1.0を詳しく見てみる

Getting started
サイトにあるGetting startedを読んでみます。
最初にkonashiライブラリを取得します。
githubから取得するか「こちらから最新版のライブラリをダウンロード」からzipファイルをダウンロードすればOKです。
手元にkonashiがありませんので、プロジェクトの作成はしませんが、引き続きGetting startedに目を通してみます。
核になる部分は2つのメソッド
[Konashi pinMode:LED2 mode:OUTPUT];
[Konashi digitalWrite:LED2 value:HIGH];
です。
上のコードで「pin番号がLED2のものをOUTPUTに設定」して
下のコードで「LED2にHIGHを書き込み」しています。
ちなみにLED2 OUTPUT HIGHはint型に#defineされています。
LED2が点灯すれば成功となります。
このGetting startedで行うことは全部でviewDidLoadに3行追加と、konashiReadyメソッドの追加。たったこれだけでLEDを点灯させることが出来ます。

Documents
Documentsを見ます。

ピン、端子の種類について
デジタル、アナログ、PWM、I2C、UARTとあります。一つの端子がいろいろ兼用していますので言葉でまとめるのは困難です。表があるとわかりやすいかもしれません。

専門用語
わからない専門用語をいくつか調べました。内部プルアップ、I2C、UARTなど。

サンプルコード
PioDrive
デジタル入出力のサンプルです。
これが一番わかりやすいので、最初に試すといいと思います。
konashi本体上のスイッチとLEDを使ってデータを送受信します。
本体のスイッチによってLED1を制御。LED2から4はアプリの画面より制御します。
(本体のスイッチとLEDを使う時は本体のジャンパーのショートをする必要があります。)

AioSample
アナログ入出力のサンプルです。
AIO0(エーアイオーゼロ)に入力、AIO1に出力します。

HardwareSample
konashiの電波強度とバッテリーの状況を取得するサンプルです。
電波はiOSデバイスとmanaka間の電波です。

PwmDrive
PWM出力のサンプル。

Kngh…