Manpages

名 前

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/ に 書 か れ て い る 。