電子書籍の厳選無料作品が豊富!

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桁
}

A 回答 (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 は使わないと思う.
    • good
    • 0
この回答へのお礼

Thanks

お礼日時:2007/08/15 21:13

何をしたいんでしょうか?


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

この回答への補足

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

補足日時:2007/08/15 16:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!