この節では、8 ビットのユーザ名と 8 ビット・データが、ftp、メール、デスクトップ・クライアント間のクライアント間通信などの通信ユーティリティによりネットワーク上で通信できる方法を説明します。
データを通信するにあたって、まず考慮すべき点が 3 つあります。
送信側のコード・セットと受信側のコード・セット
通信プロトコルが 8 ビット・データを許可するか、または 7 ビット・コード・データに限られているか
たとえば、日本のインターネットは JIS (日本工業規格) コード・データを 7 ビット・プロトコルで通信します。
プロトコル規則ごとにある変換エンコーディングの型
実際に必要となる変換は、使用される個々のプロトコルに依存します。
リモート・ホストがローカル・ホストと同じコード・セットを使用する場合は、次の事項が真になります。
プロトコルが 8 ビット・データを使用できる場合、変換は不要
プロトコルが 7 ビット・データしか使用できない場合、8 ビット・コード・ポイントを 7 ビット ASCII 値にマップする必要がある
これは、iconv() フレームワークと、次の 7 ビット・エンコード方法の 1 つを使って達成できます。
8 ビット・データを、POSIX.2 仕様の uuencode および uudecode アルゴリズムに指定されているとおりにマップする。
任意で、8 ビット・データをプロトコルで定義されているように 7 ビット変換エンコーディングにマップする。たとえば、Xlib の 7 ビット ISO2022 や MIME (Multipurpose Intrenet Message Extensions: 多目的インターネット・メッセージ拡張機能) の base64 があります。
リモート・ホストのコード・セットがローカル・ホストのコード・セットと異なるときは、次の 2 つの場合が当てはまります。必要な変換は、使用される特定のプロトコルに依存します。
プロトコルが 8 ビット・データを使用できる場合、プロトコルはどちら側が iconv() 変換を行うかを指定し、また回線上でのエンコーディングを指定する必要があります。プロトコルによっては、可能なコード・セットのすべてをエンコードでき、文字レパートリーを識別する機能のある 8 ビット変換エンコーディングを推奨します。
プロトコルが 7 ビット・データしか使用できない場合は、7 ビット変換エンコーディングと文字レパートリーの識別が必要です。
ネットワーク環境では、通信し合っているシステムのコード・セットと通信のプロトコルによって、ユーザの指定したデータが意味ある方法でリモート・システムに送信されるように、データの変換方法が決定されます。(ユーザ名でなく) ユーザ・データを送信側のコード・セットから受信側のコード・セットに変換したり、プロトコルに準拠するよう 8 ビット・データを 7 ビット形式に変換する必要があります。このことを達成するには一様なインタフェースが必要です。
次の例では、iconv_open()、iconv()、iconv_close() の使い方を説明し、iconv() インタフェースの使用方法を示しています。この変換を実行するには、 iconv_open() の次に必ず iconv() を続けてください。7 ビット変換および 8 ビット変換という用語は、それぞれ 7 ビット・データと 8 ビット・データの変換エンコーディングの意味で使用します。
プロトコルが 8 ビット・データを使用できる場合は、同じコード・セットが使用されているので 8 ビット・データを使用します。変換は必要ありません。
プロトコルが 7 ビット・データしか使用できない場合は、iconv() を使用します。
locale_codeset は、そのロケールのアプリケーションによって使用されているコード・セットです。nl_langinfo()(CODESET) 関数を使用して現在のロケールに関連付けられたコード・セットを獲得できますが、それは変換名が nl_langinfo()(CODESET) 関数からの戻り値と一致するかどうかは実装に依存します。
表 3-1 に、さまざまな条件のもとで変換を実行する際の iconv() の使用方法を示します。プロトコルによっては他の変換が必要な場合もあります。
表 3-1 変換を実行するための iconv の使用方法
|
同じコード・セットを使用するシステムとの通信 (例: XYZ) |
異なるコード・セットを使用するシステムとの通信、または受信側のコード・セットが不明 |
||
使用する変換 |
7 ビット・プロトコル |
8 ビット・プロトコル |
7 ビット・プロトコル |
8 ビット・プロトコル |
コード XYZ |
無効 |
最適 |
無効 |
リモート・コード・セットが不明の場合無効 |
7 ビット変換 ISO2022 |
OK |
OK |
最適 |
OK |
8ビット変換 ISO2022, ISO10646 |
無効 1 |
OK |
無効 |
最適 |
7 ビットタグなし引用符付き印刷可能な uucode |
OK |
OK |
コード・セットの識別が必要 |
コード・セットの識別が必要 |
8 ビットタグなし base64 |
無効 |
OK |
コード・セットの識別が必要 |
コード・セットの識別が必要 |
無効とは、選択したコード・セットとプロトコル型には変換エンコーディングは使用すべきでないという意味です。
コード・セットは、状態を持つ (ステートフルな) エンコーディングと状態を持たない (ステートレスな) エンコーディングの 2 つのカテゴリに分類できます。
状態を持つエンコーディングは、特定のコード値に関連付けられた文字セットを変換するのに、シフトイン / シフトアウトなどの制御コードのシーケンスを使用します。
たとえば、コンパウンド・テキストでは、文字データの流れの中で日本語 16 ビット・データの開始を示すのにコントロール・シーケンス「ESC$(B」を使用できます。また、「ESC(B」は、そのダブルバイト文字データの終了と 8 ビット ASCII データの開始を示すのに使用できます。状態を持つエンコーディングでは、ビット値 0x43 はシフト状態が不明の場合解釈できません。EBCDIC アジア・コード・セットは、シフトイン制御とシフトアウト制御を、それぞれダブルバイトとシングルバイト・エンコーディング間の入れ換えに使用します。
別のコード・セットへの状態を持つエンコーディング変換を行うために記述されるコンバータは、特別な処理が必要なためにやや複雑になります。
状態を持たないコード・セットは、次の 2 つのうちの 1 つに分類できます。
シングルバイト・コード・セット (ISO8859 ファミリなど)
マルチバイト・コード・セット (日本語用 PC コード、通称 Shift-JIS (SJIS) など)
マルチバイト・コード・セットという用語は、1 つの文字をエンコードするのに 1 つ以上のバイトを必要とするコード・セットにも使います。マルチバイト・コード・セットは状態を持たないと見なされます。
コード・セットが同じ文字セットを表すときに限り、変換してください。