Column (No. 13)

[付録] UTF-8の仕組み

 UTF-8は文字コードのひとつと思われていますが、実はUnicodeという文字コードの決まり事の中の符号化方式を指します。逆に言うとUTF-8であれば、文字コードはUnicodeです。UTF-8という符号化方式は、インターネットではほぼデファクトスタンダードとなっています。UTF-8とは1バイトから数バイトまでの可変長のバイト数で1文字を表現します。元となっているコードはASCIIというコードです。ASCIIコードは7ビットで128種類の文字を表現する符号化方式です。ASCIIコードに関する記事はあちこちにありますが、例えばこちらに詳しく記述してあります。現在のコンピューターでは通常8ビットを1バイトとしてメモリなどに保持したり通信したりするため、1ビット余ります。この余ったビットを用いて、2バイト以上の文字と区別します。具体的には以下の様になっています。赤字のビットが可変長を制御する部分で、残りの黒字のビットが文字を表現する部分(有効範囲)です。

 ビット表現 有効範囲説明
00000000

01111111
0x00

0x7f
先頭のビットは必ずゼロであり、ASCIIコードと同じ文字を表します。GIFでは半角文字などと表現します。本来は半角とは等幅フォントと呼ばれる文字の幅が一定のフォントの中で、1文字の幅に2文字詰め込むフォントを指す言葉であり、全く符号化方式とは無関係ですが、GIFなどではASCIIコードの範囲の文字を半角文字と表現する事が多いので注意が必要です。
11000000 10000000

11011111 10111111
0x0080

0x07ff
1バイト目の先頭3ビットは必ず110であり、2バイト目先頭2ビットは必ず10です。従って、文字として使えるビットは1バイト目が5ビット、2バイト目が6ビット、合わせて11ビットの範囲です。但し、0x0000から0x007fの範囲は1バイトで表現する事になっているので使いません。
11100000 10000000
10000000


11101111 10111111 10111111
0x0800

0xffff
1バイト目の先頭4ビットは必ず1110であり、2バイト目と3バイト目の先頭2ビットは必ず10です。従って、文字として使えるビットは1バイト目が4ビット、2バイト目と3バイト目が6ビット、合わせて16ビットの範囲です。但し、0x0000から07ffまでは使いません。
11110000 10000000
10000000 10000000

11110111 10111111 10000000 10111111
0x010000

0x1fffff
1バイト目の先頭5ビットは必ず11110であり、2バイト目以降の各バイトの先頭2ビットは必ず10です。従って、文字として使えるビットは1バイト目が3ビット、2バイト目以降が6ビット、合わせて21ビットの範囲です。但し、0x000000から0x00ffffの範囲は使いません。

[付録] URNの文法とid

 URNとはUniform Resource Namesの略で、世界で一意となる文字列の表現です。NGSI V2ではURNを使用する規定はありませんが、NGSI V2の後継規格であるNGSI-LDではidにURNを使用する決まりになったため、NGSI V2でもNGSI-LDと同じURNを使う事が推奨されています。そこでこのコラムではURNについて紹介するとともに、idに使った場合の注意事項を記載します。

表現する文字列規則説明
idの値“urn:”<nid>”:”<nss>urnは必ず”urn:”で始まり、その後に<nid>と<nss>がセミコロンを挟んで並びます。
idの場合はこれで終わりですが、URNの規則ではこの後にも付加情報が続けられます。
<nid>“ngsi-ld”などの認められた文字列この部分はnamespace identifierと呼ばれる部分で、どんな種類のURNなのかを識別します。NGSI V2では”ngsi-ld”を使う決まりになっています。他のnamespaceでは、書籍には”isbn”、学術論文では”doi”、UUIDでは”uuid”など、多数のものが決められています。勝手に作ることはできません。
<nss>文字列この文字列に使える文字は、ASCII文字の内、英数字と”-“、”.”、”~”、”_”、”!”、”$”、”*”、”+”、”,”、”/”、および”:”です。
これ以外の文字を使う場合はURLエンコードします。空白や日本語は使えません。尚、規定では”@”なども使えるのですが、使用を避ける意味でここに記述していません。詳しくはこちらに記載しました。