名 前
UTF−8 − ASCII と 互 換 性 の あ る 多 バ イ ト Unicode の 符 号 化
説 明
ユ ニ コ ー ド (Unicode) 3.0 文 字 集 合 は 16 ビ ッ ト の コ ー ド 空 間 を 占 め る 。 最 も 単 純 な Unicode の 符 号 化 方 法 (UCS−2) で は 、 文 字 は 16 ビ ッ ト ワ ー ド (16 ビ ッ ト 文 字 の 列 ) で 構 成 さ れ る 。 こ の 列 に は 、 '\0' や '/' の よ う な (フ ァ イ ル 名 や C の ラ イ ブ ラ リ 関 数 の 引 き 数 の 内 部 で ) 特 殊 な 意 味 を 持 つ 16 ビ ッ ト 文 字 が 含 ま れ る こ と が あ る 。 さ ら に 、 ほ と ん ど の UNIX ツ ー ル は ASCII フ ァ イ ル を 入 力 と し て 期 待 す る の で 、 大 幅 な 変 更 な し に は 16 ビ ッ ト ワ ー ド を 文 字 と し て 読 む こ と が で き な い 。 こ れ ら の 理 由 か ら 、 UCS−2 は フ ァ イ ル 名 ・ テ キ ス ト フ ァ イ ル ・ 環 境 変 数 な ど に 用 い る 、 外 部 用 の Unicode 符 号 と し て は 不 適 切 で あ る 。 Unicode の ス ー パ ー セ ッ ト で あ る ISO 10646 Universal Character Set (UCS) は \(em 31 ビ ッ ト の よ う な \(em も っ と 大 き な コ ー ド 空 間 を 占 め る が 、 そ の 最 も 単 純 な 符 号 化 で あ る UCS−4 に も (32 ビ ッ ト ワ ー ド の 列 と し て ) 同 じ 問 題 が あ る 。
Unicode
と UCS の UTF−8 符 号 化
に は こ れ ら の
問 題 が な い の
で 、 UNIX 形 式 の OS
上 で Unicode 文 字 集
合 を 使 用 す る
た め の 一 般 的
な 方 法 と な っ
て い る 。 性 質
UTF−8 符 号 化 は 以
下 の よ う な 素
晴 し い 性 質 を
備 え て い る :
* |
UCS 文 字 の う ち 0x00000000 か ら 0x0000007f ま で (古 典 的 な US−ASCII の 文 字 ) は (ASCII と の 互 換 性 の た め に ) 単 純 に 0x00 か ら 0x7f の バ イ ト に 符 号 化 す る 。 こ れ は 7 ビ ッ ト ASCII 文 字 の み を 含 む フ ァ イ ル や 文 字 列 に 関 し て は 、 ASCII と UTF−8 で 同 じ 符 号 化 を 行 な う こ と を 意 味 す る 。 | ||
* |
0x7f よ り 大 き い の す べ て の UCS 文 字 は 、 0x80 か ら 0xfd ま で の 範 囲 の バ イ ト の み を 含 む 多 バ イ ト 文 字 列 に 符 号 化 さ れ る 。 し た が っ て 文 字 列 に ASCII バ イ ト が 含 ま れ る こ と が な く 、 '\0' や '/' の 問 題 は 発 生 し な い 。 | ||
* |
UCS−4 文 字 列 で は 辞 書 的 ソ ー ト の 順 序 が 保 た れ る 。 | ||
* |
2^31 ビ ッ ト の す べ て の UCS コ ー ド が UTF−8 を 使 用 し て 符 号 化 で き る 。 | ||
* |
UTF−8 符 号 化 で は バ イ ト 0xc0, 0xc1, 0xfe, 0xff が 使 用 さ れ る こ と は な い 。 | ||
* |
ASCII で な い UCS 文 字 の 多 バ イ ト 列 の 最 初 の バ イ ト は 、 常 に 0xc2 か ら 0xfd の 範 囲 で 表 現 さ れ 、 そ の 文 字 が 何 バ イ ト で 構 成 さ れ て い る か を 示 す 。 多 バ イ ト 列 の 残 り の 部 分 の バ イ ト は 、 そ れ ぞ れ 0x80 か ら 0xbf の 範 囲 に あ る 。 こ れ に よ り 同 期 が 容 易 に な り 、 ス テ ー ト レ ス な 符 号 化 が 可 能 に な り 、 バ イ ト の 紛 失 に 対 し て 堅 固 に な る 。 | ||
* |
UTF−8 を 使 用 し た UCS 文 字 の 符 号 化 は 最 大 6 バ イ ト の 長 さ に な る 。 し か し 、 Unicode 規 格 で は 0x10ffff よ り 先 の 文 字 を 指 定 し な い の で 、 Unicode 文 字 は UTF−8 で は 4 バ イ ト ま で に し か な ら な い 。 |
符 号 化 以 下 の バ イ ト 列 が 文 字 の 表 現 に 使 用 さ れ る 。 ど の バ イ ト 列 を 使 用 す る か は 文 字 の UCS コ ー ド 番 号 に 依 存 す る :
0x00000000 − 0x0000007F:
0xxxxxxx
0x00000080 − 0x000007FF:
110xxxxx 10xxxxxx
0x00000800 − 0x0000FFFF:
1110xxxx 10xxxxxx 10xxxxxx
0x00010000 − 0x001FFFFF:
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 − 0x03FFFFFF:
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 − 0x7FFFFFFF:
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
xxx ビ ッ ト の 部 分 に は 2 進 数 で 表 わ し た 文 字 コ ー ド の ビ ッ ト 部 分 が 対 応 す る 。 そ の 文 字 を 表 現 す る の に 最 も 短 い バ イ ト 列 の み が 使 用 で き る 。
0xd800–0xdfff
(UTF−16 サ ロ ゲ ー ト )
や 0xfffe, 0xffff (UCS の noncharacter) と
い う UCS コ ー ド の
値 は 、 UTF−8 に 準
拠 し た ス ト リ
ー ム に 入 れ る
べ き で は な い
。 例
Unicode 文 字 の 0xa9 = 1010 1001
(コ ピ ー ラ イ ト
マ ー ク ) は UTF−8 で
符 号 化 す る と
以 下 の よ う に
な る 。
11000010 10101001 = 0xc2 0xa9
0x2260 = 0010 0010 0110 0000 (不 等 号 ) は 以 下 の 通 り 。
11100010 10001001 10100000 = 0xe2 0x89 0xa0 ア プ リ ケ ー シ ョ ン に お け る 注 意 ユ ー ザ ー は ア プ リ ケ ー シ ョ ン の UTF−8 サ ポ ー ト を 有 効 に す る た め に 、
export LANG=en_GB.UTF−8 の よ う に し て UTF−8 ロ ケ ー ル を 選 択 し な け れ ば な ら な い 。 使 用 さ れ て い る 文 字 符 号 化 を 分 か っ て い な け れ ば な ら な い ア プ リ ケ ー シ ョ ン ソ フ ト ウ ェ ア は 、 以 下 の よ う に し て 常 に ロ ケ ー ル を 設 定 す べ き で あ る 。
setlocale(LC_CTYPE, "") ま た 、 プ ロ グ ラ マ ー は
strcmp(nl_langinfo(CODESET), "UTF−8") == 0 と い う 式 を 評 価 す る こ と で 、 UTF−8 ロ ケ ー ル が 選 択 さ れ て い て 、 プ レ ー ン テ キ ス ト の 標 準 入 出 力 ・ 端 末 間 通 信 ・ プ レ ー ン テ キ ス ト フ ァ イ ル の 内 容 ・ フ ァ イ ル 名 ・ 環 境 変 数 が UTF−8 で 符 号 化 さ れ て い る か を チ ェ ッ ク す る こ と が で き る 。
US−ASCII や ISO 8859 と い っ た シ ン グ ル バ イ ト の 符 号 化 が 習 慣 に な っ て い る プ ロ グ ラ マ ー は 、 こ れ ま で の 2 つ の 仮 定 が UTF−8 ロ ケ ー ル に お い て は 最 早 有 効 で は な く な っ た こ と を 知 っ て お く べ き だ 。 1 番 目 の 変 更 点 は 、 1 バ イ ト が 必 ず し も 1 つ の 文 字 に 対 応 し な い と い う 点 で あ る 。 2 番 目 の 変 更 点 は 、 最 近 の 端 末 エ ミ ュ レ ー タ は UTF−8 モ ー ド に お い て 中 国 語 ・ 日 本 語 ・ 韓 国 朝 鮮 語 の 全 角 文 字 や ス ペ ー ス が 入 ら な い (nonspacing) 合 成 文 字 (combining characters) に 対 応 し て い る の で 、 ASCII の と き の よ う に 1 文 字 出 力 し た 後 で カ ー ソ ル を 必 ず し も 1 つ だ け 進 め る わ け で は な い と い う 点 で あ る 。 今 日 で は 、 文 字 や カ ー ソ ル の 位 置 を 数 え る の に mbsrtowcs(3) や wcswidth(3) と い っ た ラ イ ブ ラ リ 関 数 を 使 う べ き で あ る 。
(VT100 端
末 な ど で 使 わ
れ る ) ISO 2022 符 号 化
形 式 か ら UTF−8 へ
切 替 え る 公 式
な エ ス ケ ー プ
シ ー ケ ン ス は ESC %
G ("b%G") で あ る 。
こ れ に 対 応 す
る UTF−8 か ら ISO 2022 へ
の リ タ ー ン シ
ー ケ ン ス は ESC % @
("b%@") で あ る 。 (G0
セ ッ ト と G1 セ ッ
ト を 切 替 え る
と い っ た ) そ の
他 の ISO 2022 シ ー ケ
ン ス は 、 UTF−8 モ
ー ド で は 使 え
な い 。 セ キ ュ
リ テ ィ
Unicode と UCS の 規 格 で
は 、 UTF−8 の 生 成
者 は で き る だ
け 短 い 形 式 を
用 い る よ う 要
求 し て い る 。
例 え ば 、 先 頭
バ イ ト が 0xc0 で あ
る よ う な 2 バ イ
ト 列 を 生 成 す
る の は 準 拠 し
て い る と は い
え な い 。 Unicode 3.1 で
は 、 規 格 に 準
拠 す る プ ロ グ
ラ ム は 最 短 の
表 現 形 式 で は
な い 入 力 を 受
け 付 け な い 、
と い う 要 求 事
項 が 追 加 さ れ
た 。 こ れ は セ
キ ュ リ テ ィ 上
の 理 由 に よ る
。 ユ ー ザ ー 入
力 が セ キ ュ リ
テ ィ 上 の 危 険
に 対 し チ ェ ッ
ク さ れ る 場 合
、 プ ロ グ ラ ム
は ASCII 版 の "/../" や
";" や "NUL" だ け
を チ ェ ッ ク し
、 最 短 に 符 号
化 さ れ て な い
こ れ ら の 文 字
を 見 過 ご し て
し ま う か も し
れ な い か ら で
あ る 。 な ぜ な
ら 、 最 短 で は
な い UTF−8 符 号 化
で は 、 こ れ ら
の 文 字 を 表 現
す る よ う な 様
々 な ASCII 以 外 の 形
式 が 存 在 す る
た め で あ る 。
標 準
ISO/IEC 10646−1:2000, Unicode 3.1, RFC 3629, Plan
9.
関 連 項 目
locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。