基本情報技術者試験の科目Bのサンプル問題を題材に,Unicodeの符号位置をUTF-8に変換する処理について学習します。この問題では,整数の除算と余りを利用して,Unicodeの符号位置をUTF-8の3バイト形式に変換する処理を確認します。
(令和4年度12月公開) 基本情報技術者試験 サンプル問題 科目B 問16
問 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。二つの には,同じ答えが入る。ここで,配列の要素番号は1から始まる。
Unicode の符号位置を,UTF-8 の符号に変換するプログラムである。本問で数値の後ろに “(16)” と記載した場合は,その数値が16進数であることを表す。
Unicode の各文字には,符号位置と呼ばれる整数値が与えられている。UTF-8 は,Unicode の文字を符号化する方式の一つであり,符号位置が 800(16) 以上 FFFF(16) 以下の文字は,次のように3バイトの値に符号化する。
3バイトの長さのビットパターンを 1110xxxx 10xxxxxx 10xxxxxx とする。ビットパターンの下線の付いた “x” の箇所に,符号位置を2進数で表した値を右詰めで格納し,余った “x” の箇所に,0を格納する。この3バイトの値が UTF-8 の符号である。
例えば,ひらがなの “あ” の符号位置である 3042(16) を2進数で表すと 11000001000010 である。これを,上に示したビットパターンの “x” の箇所に右詰めで格納すると,1110xx11 10000001 10000010 となる。余った二つの “x” の箇所に0を格納すると,“あ” のUTF-8 の符号 11100011 10000001 10000010 が得られる。
関数 encode は,引数で渡された Unicode の符号位置を UTF-8 の符号に変換し,先頭から順に1バイトずつ要素に格納した整数型の配列を返す。encode には,引数として,800(16) 以上 FFFF(16) 以下の整数値だけが渡されるものとする。
〔プログラム〕
○整数型の配列: encode(整数型: codePoint)
/* utf8Bytesの初期値は,ビットパターンの “x” を全て0に置き換え,
8桁ごとに区切って,それぞれを2進数とみなしたときの値 */
整数型の配列: utf8Bytes ← {224,128,128}
整数型: cp ← codePoint
整数型: i
for (i を utf8Bytesの要素数 から 1 まで 1 ずつ減らす)
utf8Bytes[i] ← utf8Bytes[i] + (cp ÷ の余り)
cp ← cp ÷ の商
endfor
return utf8Bytes
解答群
| ア ((4 - i) × 2) | イ (2 の (4 - i)乗) | ウ (2 の i乗) |
| エ (i × 2) | オ 2 | カ 6 |
| キ 16 | ク 64 | ケ 256 |
【解答】ク
【解説】
UTF-8の3バイト形式では,Unicodeの符号位置の下位6ビットずつを2,3バイト目に格納し,残った上位ビットを1バイト目に格納する。6ビットで表せる値は0~63なので,プログラムでは64で割った余りを求めることで,下位6ビットを取り出している。具体的には,cp ÷ 64 の余りを utf8Bytes[i] に加え,cp ÷ 64 の商を次の処理に使う。この処理を3回繰り返すことで,Unicodeの符号位置を6ビットずつ取り出して,UTF-8の各バイトに格納している。例えば,“あ” の符号位置である 3042(16) は10進数で12354なので,最初に12354を64で割ると,商が193,余りが2となる。次に193を64で割ると,商が3,余りが1となり,最後に3を64で割ると,商が0,余りが3となる。したがって,初期値が {224,128,128} である utf8Bytes に,右端から順番に 2,1,3 を加えることで,{227,129,130} となる。これは2進数では {11100011,10000001,10000010} であり,“あ” の UTF-8 の符号になる。よって,空欄には 64 が入る。
【参考】
“あ” の場合。
この問題のポイント
この問題から学べることは,
- Unicodeの符号位置とUTF-8
- 整数を64で割ったときの商と余り
- 除算と余りを利用してビット列を分割する方法
- Unicodeの符号位置をUTF-8の3バイト形式に変換する処理
です。特に,64で割った余りを利用して下位6ビットを取り出し,64で割った商を次の処理に使うことで,Unicodeの符号位置を6ビットずつ取り出す処理を理解しておきましょう。
基本情報技術者試験の学習におすすめの参考書
基本情報技術者試験の合格を目指す方におすすめの参考書です。
学習のお役に立ちましたら
この記事が少しでも学習のお役に立ちましたら,今後も分かりやすい解説や学習コンテンツを継続してお届けする励みになります。
よろしければ、このサイトを応援いただけますと嬉しいです。
※OFUSEは,クリエイターやコンテンツ制作を直接支援できるサービスです。


