UTF-8単語

ユーティーエフエイト
3.6千文字の記事
  • 4
  • 0pt
掲示板へ

UTF-8とは、Unicode文字符号化形式/文字符号化方式の一つである。

概要

UTF-8とは、Unicode文字符号化形式/文字符号化方式の一つで、1文字は1〜4バイトバイト列で表現される。最大の特長は、英数字(ASCII文字)だけの場合はASCII全互換(というか完全に一致)になることである。

Unicodeの表現形式として広く用いられており、デファクトスタンダードであるとも言える。

長所

短所

ただ、これらの長所・短所もコンピューターの性向上や大容量化、あるいはデータ構造の工夫等により問題になる場面は少なくなっている。実際の所、みんながUTF-8を標準で使うようにすればもう文字コード文字化けで悩まなくてもいいよね、という側面が大きい。

詳細

1バイトを0と1に直した時、先頭からいくつ1が連続するかでそのバイトの役割が決まる。

1バイトの割当を円グラフにすると以下のようになる。

0-31, 127 制御文字
32-126 英数記号
128-191 2バイト以降
192-193 不使用(2バイト文字先頭)
194-223 2バイト文字先頭
224-239 3バイト文字先頭
240-244 4バイト文字先頭
245-247 不使用(4バイト文字先頭)
248-255 不使用(5バイト以上相当)

1バイト文字

1バイト文字については、ASCIIと全く同じである。

ASCIIは7ビット、つまり0-127(00-7F)だが、0-31と127は制御文字であり、改行コードなどを除けば通常のテキストでは使用されない。

残りの32-126アルファベットの大文字・小文字数字と各種記号である。 → ASCII

2バイト文字

2バイト以上の文字は、先頭に使用バイト数を決めるデータが来て、後ろにデータが続く。2バイト以降には128-191(80-BF)が使われるが、先頭の2ビットは10で固定なので残りの6ビットがデータ部分となる。

2バイトの先頭バイトは194-223(C2-DF)である。先頭の3ビットが110で固定なので、5ビットがでデータ部分となり、2バイトの6ビットと合わせて11ビットまでのUnicodeが表現可である。

最小バイト数の原則

C0とC1(192-193)は、データ部分のビットが00000と00001であり、2バイトの6ビットと合わせても、7ビット(1バイト文字)で表現可である。Unicodeには最小バイト数で表現しなければならないという原則があるため使用されない(故意に冗長なバイト列にしてセキュリティチェックすり抜ける問題が発生したためルールが追加された)。

3バイト文字

3バイト文字の先頭バイトは224-239(E0-EF)である。先頭4ビットが1110で固定のため、残り4ビットと2-3バイトの6×2ビットで16ビットまでのUnicodeが表現可である。

最小バイト数の原則により、11ビットまでで表現可なものは除かれるので、2バイトは11-6=5ビットよりも多いビット数を使用する必要があり、1010 0000(2) 以上でなければならないため、160-191(A0-BF)に限られる。

4バイト文字

4バイト文字の先頭バイトは240-244(F0-F4)である。先頭5ビットが11110で固定のため、残り3ビットと2-4バイトの6×3ビットで21ビットまでのUnicodeが表現可である。

最小バイト数の原則により、16ビットまでで表現可なものは除かれるので、2バイトは16-6×2=4ビットよりも多いビット数を使用する必要があり、1001 0000(2) 以上でなければならないため、144-191(90-BF)に限られる。

Unicodeの上限値はU+10FFFF(1 0000 1111 1111 1111 1111(2))である。245-247(F5-F7)はデータ部分が101-111であり2バイト以降の18ビットと合わせるとUnicodeの上限値をえるため使用されない。

5バイト文字以上

5バイト文字と6バイト文字は先頭バイトをそれぞれ248-251(F8-FB)、252-253(FC-FD)にすれば実現可だが、やはり最小バイト数の原則に反するかUnicodeの上限値をえるため使用されない。

254-255(FE-FF): 7-8バイト文字も、5-6バイト文字と同じく使用されない。UTF-16UTF-32バイトオーダーマークで使用されるため、ファイルの先頭に出てきた場合は、UTF-8ではなく、UTF-16UTF-32であろうということになる。

バイトオーダーマーク

テキストファイルの先頭にU+FEFF: ZERO WIDTH NO-BREAK SPACE (ZWNBSP) を付加することができ、BOM(Byte Order Mark)と呼ばれる。Byte Orderというのはデータを上位バイトから順に並べるビッグエンディアンと下位バイトから並べるリトルエンディアンの区別のことだが、データを先頭の2-4バイトを読むだけで符号化方式が分かるようにする仕組みも兼ねている。

UTF-8では使用が許容されるというだけで推奨ではない。むしろASCIIとの互換性が損なわれるので、Unicode仕様上では許容されているにも関わらず、対応していない処理系も多いというのが現実である。
そもそもUTF-8にはリトルエンディアンはない。

ちなみにUTF-8のBOMはEF BB BF(239 187 191)である。これを2進数に変換すると、

1110 1111 1011 1011 1011 1111

であり、1110から始まるので3バイト文字だと分かる。さらにデータ部分を抜き出すと

1110 1111 1011 1011 1011 1111
1111 11 1011 11 1111
1111 1110 1111 1111
FE FF

ちなみに、U+FEFF: ZERO WIDTH NO-BREAK SPACE (ZWNBSP) は、元々は改行禁止を表す文字である。

バイトオーダーマーク

メモ帳問題

Windowsメモ帳はBOMなしUTF-8の編集時に勝手にBOMを付加することで悪名高かったが、Windows 102019年5月メジャーアップデートからBOMなしUTF-8がデフォルトになった。

数字だけだとASCII完全に一致するので、ASCIIだと思って解釈していたら突然2バイト文字が出てきてバグったなどという事態を避けるため、区別できるようにしようと思ったらBOMをつけるしかなかったのかもしれない。
もしくは、ExcelがBOMのいUTF-8のCSVを読み込むと正しく解釈できないのに引き摺られたか。

関連項目

【スポンサーリンク】

  • 4
  • 0pt
スマホ版URL:
https://dic.nicovideo.jp/t/a/utf-8
記事編集 編集履歴を閲覧

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

UTF-8

2 ななしのよっしん
2021/11/06(土) 09:56:15 ID: p6tbD0S7Rz
今となっては「どうして最初からUTF-8にならなかったんだ」という話なんだけど、制定当初のメモリ事情を考えると仕方ない話よな……
3 ななしのよっしん
2021/11/06(土) 10:55:38 ID: jvC7VceLKF
>>1
気づいて下さりありがとうございます
ただ、「粗品」よりもニコニコ大百科:グラフ機能の方が1年以上先行して開されているので、「粗品」のパクりみたいに言われるのは個人的にはいささか心外ではあります。

>>2
Unicode1.0の時に、2バイトで全ての文字を網羅できると楽観視したあたりから計算が狂い始めたっぽい。ASCIIの時代にこれを考えるのは無理ゲー
4 ななしのよっしん
2021/11/06(土) 11:16:20 ID: Xq5Ixk4zKO
そもそもNEC特殊文字IBM文字NEC選定IBM文字なんてできたのはなぜだったかって話だしね
統一仕様が策定しやすいだけでもいい世の中になったもんだ
5 ななしのよっしん
2021/11/06(土) 12:27:44 ID: p6tbD0S7Rz
」「」「」の3記事にリンク貼ってもいいかもしれない

>>3
サロゲートペア」の記事でその辺りの経緯を駄弁ってみました。UTF-8はせっかく31ビットまで定義されていたわけで、21ビットという足枷なしに活躍させてあげたいんですけどね……
6 ななしのよっしん
2021/11/06(土) 14:09:14 ID: jvC7VceLKF
>>5
UTF-16の記事で書こうとしていたら被った…
とりあえず投稿しておいたので、統合についてはUnicodeの記事も含めて後日検討します。
7 ななしのよっしん
2021/11/07(日) 09:55:31 ID: p6tbD0S7Rz
1バイト単位での可視化の方法としてなるほどなぁと
https://en.wikipedia.org/wiki/UTF-8#Codepage_layoutexit
8 ななしのよっしん
2021/12/14(火) 13:49:56 ID: qmi43fY4Ds
UTF-8で統一すべき。そうじゃなくても少なくともUnicode
日本語のSJISとか、中韓台の文字コードとかくしていくべき。
9 ななしのよっしん
2021/12/17(金) 04:43:41 ID: d9Wa3EU+fb
>日本語のSJISとか、中韓台の文字コードとかくしていくべき。
CJK統合漢字「おっそうだな」

……ってのは置いといて、UTF-8と関連する文字コードの話についてはこの記事がめちゃくちゃ面い↓
C++標準化委員会、ついに文字とは何かを理解する: char8_t
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85bexit

文字コードっつーかこの世の文字そのものがめちゃくちゃ複雑なので、
現在では最大公約数的にUTF-8が最適解だよねってことになってるけど
そこまではほんと紆余曲折の苦労があった(今もある)
10 ななしのよっしん
2021/12/17(金) 09:26:22 ID: p6tbD0S7Rz
UTF-8は「2バイト以降を独立したコードポイントに置いている」のが大きな利点かつ大発明であって、EUC-JPで「“”(b3a4) を検索すると“ここ”(a4b3 a4b3) がヒットする」みたいな現を回避できたんだが、国旗絵文字ZWJ結合絵文字でその現が再び発生してしまったのをなんとかしてほしい
人は過去から学ばないのか
11 ななしのよっしん
2021/12/21(火) 07:49:55 ID: 0Q1hCrxjkm
Windows10ではメモ帳デフォルトUTF-8になったんですね https://xtech.nikkei.com/atcl/nxt/column/18/00723/042300004/?P=3exit
記事の円グラフですが、これだけ項が多いと棒グラフで描いた方が見やすいと思います。