2012年7月25日水曜日

UTF8-16変換処理の抜け

先に発表したUTF8-16変換処理でdefine関数の部分の定義が抜けていたので公開。

#define b32(w)  (((w)&0xff000000)>>24)
#define b24(w)  (((w)&0x00ff0000)>>16)
#define b16(w)  (((w)&0x0000ff00)>> 8)
#define b8(w)  ( (w)&0x000000ff)
#define w16(h,l)   (((h)<<8 data-blogger-escaped-define="define" data-blogger-escaped-hh="hh" data-blogger-escaped-hl="hl" data-blogger-escaped-l="l" data-blogger-escaped-lh="lh" data-blogger-escaped-ll="ll" data-blogger-escaped-pre="pre" data-blogger-escaped-w16="w16" data-blogger-escaped-w24="w24" data-blogger-escaped-w32="w32">







2012年7月20日金曜日

UTF16をUTF8に変換する処理

今度はUTF16をUTF8に変換する処理。

実を言うと、UTF16はあまり使い道がない。と思う。
->とか書いてたけど、実はiOSの中の文字コードはUTF16だと判明。
characterAtIndexで返ってくるコードはUTF16である。
UTF8だと思って処理を書いてたらうまく動かないので調べたらそうだった。
(後日アップルのドキュメントを読み返したら、UTF16だとちゃんと書いてあった。
でも、あんなところに1行だけでは気が付く人少ないのでは?)
ただし、ソースコード(その中に記述する文字列)そのものはUTF8でなくてはならない。
ここは少しややこしいところ。

SHIFT-JISは、組み込み機器ではプログラムもデータも小さくなるので非常に使いやすい。
表示幅とバイト数が一致するのもいい点である。
UTF8はASCIIコードとの互換性が高く、ASCII用のプログラムを移植するに都合がいいことが、X-BASIC for iOSの開発でよくわかった。

SHIFT-JISとの変換に関してはUTF16の方が行いやすい。

ulong Utf16ToUtf8(ulong n)
// http://ja.wikipedia.org/wiki/UTF-8 参照
// Unicodeは文字コードの総称で、UTF-16やUTF-8はその表現方法の種類、である。
{
 if (n<=0x7f) return(n); // ASCII互換
 if (n<=0x7ff) {
  // 8421 8421   8421 8421
  // 110x_xxxx | 10xx_xxxx
  return  w16(             (0xc0|(n>>6))   , (0x80|(n&0x3f)) );
 }
 if (n<=0xffff) {
  // 8421 8421   8421 8421   8421 8421
  // 1110_xxxx | 10xx_xxxx | 10xx_xxxx
  return w24(       (0xe0|((n>>12)&0x0f)) , (0x80|((n>>6)&0x3f)) , (0x80|(n&0x3f)) );
  
 }
 // n<=0x1fffff
 // 8421 8421   8421 8421   8421 8421   8421 8421
 // 1111_0xxx | 10xx_xxxx | 10xx xxxx | 10xx xxxx
 return w32( (0xf0|((n>>18)&0x07)) , (0x80|((n>>12)&0x3f)) , (0x80|((n>>6)&0x3f)) , (0x80|(n&0x3f)) );
 
 // 定義上はこれ以上もあるが、実在しないので省略
} 
 

2012年7月14日土曜日

UTF8の文字コードをUTF16に変換する処理

しばらく忙しすぎて更新できてなかった。
理由は、どスランプとか開発作業とか。
中核の処理は動くようになったが、まだiOSへの対応については手つかず。
ずっとWindowsのCygwin上で開発してたので、Xcodeも忘れてしまった(^_^)。
まずはその思い出しから始めないと。

ということで、超久しぶりの更新は、そのプログラム中で使っている処理を1つ。
UTF8の文字コードをUTF16に変換する処理。
ただし、UTF8で32ビットの範囲に収まるコードのみ。

UTFまわりの処理はインターネットで探しても 意外と見つからない。
最近はOSや言語レベルでサポートされているようで、
Cでの記述、というかフローが正確にわかる物が無かった。
ということで、公開。

ulong Utf8ToUtf16(ulong b)
{
 if (b<=0xff) return(b); // ASCII
 if (b<=0xffff) {
  return (        (b16(b) & 0x1f) << 6) + (b8(b) & 0x3f);
 }
 return ( ((b24(b) & 0xf) << 12) + ((b16(b) & 0x3f) << 6) + (b8(b) & 0x3f) );
}