Unicode を使用するサーバーと Unicode 以外を使用するクライアント間のデータ変換の管理

このトピックでは、サーバー側のデータ ストレージが Unicode で、そのデータにアクセスするクライアント アプリケーションが特定のコード ページを使用している場合に、文字データの整合性を保つ方法について説明します。

データ入力

Unicode 以外のデータをクライアントから送信し、そのデータがサーバーでは Unicode で保存されるときに、以下のいずれかの条件を満たしている場合、クライアントやコード ページの種類を問わず、データは正しく保存されます。

  • 文字列が RPC (リモート プロシージャ コール) のパラメーターとしてサーバーに送信される場合。

  • 文字列定数が大文字の N で始まっている場合。クライアント アプリケーションが Unicode 対応であるかどうかにかかわらず、文字列定数の先頭は N にする必要があります。SQL Server では、N プレフィックスがないと、文字列はデータベースの既定の照合順序に対応するコード ページに変換されます。文字列がこのコード ページにない場合は、失われます。

データ取得

Unicode に対応していないクライアント アプリケーションが、データを Unicode 以外のバッファーに取得する場合、クライアント コンピューターのコード ページで表現できるデータしか取得または変更できません。つまり、ASCII 文字表現はすべてのコード ページで同じなので、ASCII 文字は常に取得できます。ASCII 以外のデータは、各コード ページ間の変換により取得できるかどうかが決まります。

たとえば、現在米国内だけで運用されているアプリケーションがあり、これが日本に配置されることになったとします。SQL Server データベースは Unicode に対応しているので、Unicode でテキストを処理できるようにアプリケーションが変更されていなくても、英語と日本語の両方のテキストを同じテーブルに保存できます。アプリケーションが上記の 2 つの条件のいずれかを満たしている限り、日本のユーザーは Unicode 非対応のアプリケーションを使用して日本語データの入力や取得が可能で、米国のユーザーは英語データの入力や取得が可能です。どちらのユーザーのデータもすべてそのままデータベースの同じ列に保存され、Unicode で表現されます。この場合、データセットすべてに対応したレポートを生成する Unicode 対応のレポート アプリケーションを配置できます。ただし、アプリケーションでは英語ユーザーが使用するコード ページ (1252) に存在しない文字を表示できないので、英語ユーザーは日本語の行を表示することはできません。

英語のユーザーと日本語のユーザーが相手のレコードを表示する必要がなければ、このような状態でも問題ありません。1 つのコード ページでは表現できないテキストを含むレコードを表示または変更できる必要がある場合は、アプリケーションを変更して Unicode を使用できるようにする以外に方法はありません。

Web ベースのアプリケーション

クライアント側のプログラムが Web ベースのプログラムか、ASP (Active Server Pages) ページに接続するプログラムの場合、クライアント側の HTML ページとサーバー側の ASP ページの両方に、メタデータが指定されます。サーバーの ASP エンジンとクライアントのブラウザー間でどのように文字列を変換するかを指定するために、このようなメタデータ指定が必要です。

クライアント側の HTML ページでは、META 属性で CHARSET コードを指定して、文字セット データがクライアントのエンコード形式に変換されるように指定する必要があります。たとえば、次の HTML ページでは、big5 を CHARSET コードに指定して、950 (中国語繁体字) コード ページに文字データを変換するようにクライアントに通知しています。

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=big5">
<!-- 
     
-->
</HEAD>
<BODY>
<!--
   body
-->
</BODY>
</HTML>

サーバー側の ASP ページでは、クライアント ブラウザーが使用しているコード ページを ASP Web アプリケーションに通知する必要があります。Session.CodePage プロパティを指定するか、@CodePage ディレクティブを指定します。いずれの方法でも、サーバーからクライアントへのデータ変換、および GET と POST のクライアント要求が処理されます。次の例では、これら 2 つの方法を使用して、クライアントのコード ページ (950 (中国語繁体字)) を相互に変換するように指定しています。

<%@ Language=VBScript codepage=950 %>
<%  Session.CodePage=950 %>

なお、文字列リテラルの先頭に文字 N を指定することを忘れないでください。