多くの言語では文字の数はシングルバイトの文字セットで扱える程度です。このような文字セットでは、各文字はシングルバイト (2 桁の 16 進数) で表されます。
シングルバイトのセットでは最大 256 文字を表すことができます。アクセント記号の付いた文字を含め、国際的に使用するすべての文字を保持できるシングルバイト文字セットはありません。この問題は、1 つ以上の国の言語に適する文字セットを記述するコード・ページのセットの開発により解決されました。たとえば、コード・ページ 1253 にはギリシャ語の文字セットが含まれており、コード・ページ 1252 には西ヨーロッパ言語の文字セットが含まれています。コード・ページは多数あり、その名前も多数あります。上記の例は、Windows のコード・ページです。
わずかな例外はありますが、文字 0 ~ 127 はすべてのコード・ページで共通です。この範囲の文字のマッピングを「ASCII」文字セットと呼びます。これには、英語のアルファベットの大文字と小文字、共通の句読表記記号、数字が含まれます。この範囲は「7 ビット範囲」 (127 までの文字を表すのに 7 ビットしか必要ないため) または「下方ページ」と呼ばれます。128 ~ 255 までの文字は「拡張文字」、または「上方コード・ページ文字」と呼ばれ、コード・ページ間で異なります。
英語のアルファベット文字だけを使用する場合は、各コード・ページの ASCII 部分 (0 ~ 127) のみで表せるため、コード・ページの互換性の問題が起こることはほとんどありません。しかし、その他の文字を使用すると、非英語環境ではよく起こることですが、データベースとアプリケーションが異なるコード・ページを使用している場合に、問題が起こる可能性があります。
たとえば、UTF-8 文字セットを使用するデータベースが cp1252 データを含むファイルからテーブルをロードするときに、LOAD TABLE 文でエンコードが cp1252 に指定されていなかったとします。エンコードが指定されていないので、データのエンコードは UTF-8 であると想定され、文字変換は実行されないので、cp1252 エンコードがデータベースに直接格納されます。つまり、cp1252 では 16 進数の 80 で表されているユーロ記号が UTF-8 に変換されません。UTF-8 のユーロ記号は E2 82 AC の 3 バイト・シーケンスで表されますが、この例の場合はデータベースに 80 として格納されます。後でアプリケーションからデータを要求されたとき、データベース・サーバはデータを UTF-8 からクライアントの文字セットに変換しようとします。この変換により、文字の破損が発生します。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |