• ベストアンサー

UTF8の文字

1文字のUTF8の長さは、1~6桁がありますが、 下記のような、3文字以上の場合の処理はどうしたほうがいいですか。 ※sInputは、unsigned short if ( (*pInput < 0) && *(pInput+1) ) { sInput = ((byte)(*(pInput++)))<<8; // 2桁 sInput |= (byte)(*(pInput++)); }else{ sInput = (byte)(*(pInput++)); // 1桁 }

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

UTF8 のエンコーディングがわかっていれば問題ない, はずなんだけど.... これ, いきなり 2バイトのときから間違っているんじゃないかな? 各コードポイントのバイトは先頭バイトで決まり, 0??? ???? ⇒ 1バイト (7ビット) 110? ???? ⇒ 2バイト (11ビット) 1110 ???? ⇒ 3バイト (16ビット) 1111 0??? ⇒ 4バイト (21ビット) 1111 10?? ⇒ 5バイト (26ビット) 1111 110? ⇒ 6バイト (31ビット) (2バイト目以降は全て 10?? ???? の形) だったはず. だから, 例えば if (*(byte *)pInput & 0x80 == 0) { sInput = *(byte *)pInput; } else if (*(byte *)pInput & 0xe0 == 0xc0) { sInput = ((*(byte *)pInput & 0x1f) << 6) + (*(byte *)(pInput + 1) & 0x3f); } else if (*(byte *)pInput & 0xf0 == 0xe0) { sInput = ((*(byte *)pInput & 0x0f) << 12) + ((*(byte *)(pInput + 1) & 0x3f) << 6) + (*(byte *)(pInput + 2) & 0x3f); } などとやればいいんじゃないかな. あ, インクリメントなんかは適当に処理してね. ついでだけど, この辺の処理は全部 unsigned にした方が簡単だし, 特別な事情がない限り short は使わないと思う.

minidx
質問者

お礼

Thanks

その他の回答 (1)

回答No.1

何をしたいんでしょうか? 長さ6バイトの変数を用意したらいいんじゃないですか?

minidx
質問者

補足

文字単位で、該当文字の数字値を取得して、別のところの配列のインデックス値として使いたいのです。英字の変換は簡単だけど、漢字など3桁長以上のは良くわからないです…

関連するQ&A