|
HOME > Linux Tips ( 目次 ) > Linux コマンド 一覧表 > u > utf-8 - 約束事その他の説明 utf-8 - 約束事その他の説明 - Linux コマンド集 一覧表名前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)" は 31 ビットのコード空間を占めるが、その最も単純な符号化である UCS-4 にも (32 ビット・ワードの列として) 同じ問題がある。 Unicode と UCS の UTF-8 符号化にはこれらの問題がないので、Unix 形式の OS 上で Unicode 文字集合を使用するための一般的な方法となっている。 性質UTF-8 符号化は以下のような素晴しい性質を備えている:
符号化以下のバイト列が文字の表現に使用される。 どのバイト列を使用するかは文字の UCS コード番号に依存する:
例
Unicode
文字の 0xa9 = 1010 1001 (コピーライト・マーク) は UTF-8 で符号化すると
0x2260 = 0010 0010 0110 0000 (不等号) は
アプリケーションにおける注意ユーザーはアプリケーションの UTF-8 サポートを有効にするために、以下のようにして UTF-8 ロケールを選択しなければならない。
使用されている文字符号化を分かっていなければならない アプリケーションソフトウェアは、 以下のようにして常にロケールを設定すべきである。
また UTF-8 ロケールが選択されていて、プレーンテキストの標準入出力・端末間通信・ プレーンテキストファイルの内容・ファイル名・環境変数が UTF-8 で符号化されているかをチェックするために、 プログラマーは以下のような式を試すことができる。
US-ASCII や ISO 8859 といったシングルバイトの符号化が習慣になっているプログラマーは、 これまでの 2 つの仮定が UTF-8 ロケールにおいては最早有効ではなくなったことを知っておくべきだ。 1 番目の変更点は、1 バイトが必ずしも 1 つの文字に対応しないという点である。 2 番目の変更点は、最近の端末エミュレータは UTF-8 モードにおいて中国語・日本語・韓国朝鮮語の 全角文字 やスペースが入らない (non-spacing) "合成文字 (combining characters)" に対応しているので、 ASCII のときのように 1 文字出力した後で カーソルを必ずしも 1 つだけ進めるわけではないという点である。 今日では、文字やカーソルの位置を数えるのに mbsrtowcs (3) や wcswidth (3) といったライブラリ関数を使うべきである。 (VT100 端末などで使われる) ISO 2022 符号化形式から UTF-8 へ切替える公式なエスケープシーケンスは ESC % G ("\x1b%G") である。 これに対応する UTF-8 から ISO 2022 へのリターンシーケンスは ESC % @ ("\x1b%@") である。 (G0 セットと G1 セットを切替えるといった) その他の ISO 2022 シーケンスは、UTF-8 モードでは使えない。 予知できる将来では、POSIX システム上の一般的な文字符号化の全てのレベルで UTF-8 が ASCII と ISO 8859 を置き換え、プレーンテキストを扱う非常に優れた環境が作られることが期待できる。 セキュリティUnicode と UCS の規格では、 UTF-8 の生成者はできるだけ短い形式を用いるよう要求している。 例えば、先頭バイトが 0xc0 であるような 2 バイト列を 生成するのは準拠しているとはいえない。 Unicode 3.1 では、規格に準拠するプログラムは 最短の表現形式ではない入力を受け付けない、という要求事項が追加された。 これはセキュリティ上の理由による。 ユーザー入力がセキュリティ上の危険に対しチェックされる場合、 プログラムは ASCII 版の "/../" や ";" や "NUL" だけをチェックし、 最短に符号化されてないこれらの文字を見過ごしてしまうかもしれないからである。 なぜなら、最短ではない UTF-8 符号化では、これらの文字を表現するような様々な ASCII 以外の形式が存在するためである。 準拠ISO/IEC 10646-1:2000, Unicode 3.1, RFC2279, Plan 9. 著者Markus Kuhn <mgk25@cl.cam.ac.uk> 関連項目
|
|