管理 Unicode 服务器与非 Unicode 客户端之间的数据转换

本主题介绍了当服务器端数据以 Unicode 存储,而与数据交互的客户端应用程序使用的却是特殊代码页时,如何保持字符数据的完整性。

数据输入

当把客户端发送的非 Unicode 数据以 Unicode 存储在服务器中时,如果具备下列条件之一,则来自任何客户端的任何代码页的数据都可以正确地存储。

  • 字符串作为远程过程调用 (RPC) 的参数发送到服务器。

  • 字符串常量以大写字母 N 开头。无论客户端应用程序是否能够识别 Unicode,必需这样做。如果没有字母 N 前缀,则 SQL Server 会将字符串转换为与数据库的默认排序规则相对应的代码页。此代码页中没有的字符都将丢失。

数据检索

如果客户端应用程序不支持 Unicode 而将数据检索到了非 Unicode 缓冲区,则客户端只能检索或修改客户端计算机代码页可以表示的数据。这意味着 ASCII 字符始终可以检索,因为 ASCII 字符的表示形式在所有代码页中都是相同的,而任何非 ASCII 数据是否可以检索则取决于代码页间的转换。

例如,假设有一个当前仅在美国 (U.S.) 运行却在日本使用的应用程序。由于 SQL Server 数据库能够识别 Unicode,因而,即使未修改该应用程序以便处理 Unicode 文本,也可以将英语和日语文本存储在同一个表中。只要应用程序符合上述条件之一,日语用户就可以使用非 Unicode 应用程序输入和检索日语数据,美国用户就可以输入和检索英语数据。来自这两组用户的所有数据均将完整地存储在数据库的同一列中,并且以 Unicode 表示。这样,便能够部署可以生成完整数据集的报表且支持 Unicode 的报表应用程序。但是,英语用户无法查看日语行,因为应用程序无法显示任何其代码页 (1252) 上没有的字符。

如果这两组用户不需要查看对方的记录,则此情形是可以接受的。如果某个应用程序用户必须能够查看或修改单一的代码页无法表示的文本记录,则只能修改应用程序以便能够使用 Unicode,除此之外,别无选择。

基于 Web 的应用程序

如果客户端程序是基于 Web 的或者是连接到动态服务器页 (ASP) 页,则在客户端 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 客户端请求。以下是将两种方法用于指定与客户端的代码页(950,即繁体中文)之间的转换的示例。

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

最后,必须记住给任何字符串文字加上字母 N 前缀。