Firebird 2.5 中关于连接字符串字符集的修复
作者:Adriano dos Santos Fernandes [email protected]
日期:2008-12-15
在 FB 2.5 之前,连接字符串中使用的文件名总是从客户端传递到
服务器,而不进行任何转换。在服务器上,这些文件名也直接用于操作系统 API 函数,而不进行
任何转换。这导致了当客户端和服务器是不同操作系统,或同一操作系统但使用不同
代码页时,使用非 ASCII 字符的文件名无法很好地互操作。
FB 2.5 通过以下方式解决了这个问题:
默认情况下,文件名被视为使用操作系统代码页。
引入了一个新的 DPB,名为 isc_dpb_utf8.filename。其含义是改变上述规则,使 FB
将传入的文件名视为 UTF-8 编码。
如果 v2.5(或更新版本)客户端与早于 v2.5 的远程服务器通信,并且
使用了 isc_dpb_utf8.filename,客户端会将文件名从 UTF-8 转换为客户端
代码页,并将该文件名传递给服务器。客户端会移除 isc_dpb_utf8.filename DPB。
这保证了当客户端和服务器操作系统使用相同代码页时的向后兼容性。
如果 v2.5(或更新版本)客户端与 v2.5(或更新版本)服务器通信,并且
未使用 isc_dpb_utf8.filename,客户端会将文件名从操作系统代码页转换为
UTF-8,并插入 isc_dpb_utf8.filename DPB。如果使用了 isc_dpb_utf8.filename,客户端则直接
将原始文件名包含在 DPB 中传递给服务器。因此,客户端总是向服务器传递
UTF-8 文件名和 isc_dpb_utf8.filename DPB。
服务器接收到的文件名遵循上述相同规则。但请注意,v2.5 客户端
可能会自动转换文件名并插入 DPB。早于 v2.5 的客户端不会这样做,
因此接收到的文件名将被视为使用服务器代码页。我们再次保证了
当客户端和服务器代码页相同时的向后兼容性。
操作系统代码页和 UTF-8 可能不是文件名的最佳选择。例如,如果您有一个
ISQL(或其他工具)脚本,并且该脚本使用另一种连接字符集。您无法
使用多种字符集(代码页)正确编辑脚本(或任何文件)。因此,您现在可以
将连接字符串文件名中的任何 Unicode 字符编码为 ASCII 字符。这
通过使用 # 符号实现。它是 Unicode 码点编号(十六进制
格式,如 U+XXXX 表示法)的前缀。您应该这样写:#XXXX,其中 X 为 0-9、a-f、A-F。
如果您想使用字面意义的 #,可以使用 ## 或 #0023(其对应的码点编号)。
该字符即使在客户端早于 v2.5 的情况下,也会在服务器端以这种新语义进行解释。
用于转换的操作系统代码页为:
- Windows:Windows ANSI 代码页
- 其他:UTF-8
更新于 2.5 Beta 2:2008-07-11
这些规则现在也适用于字符串 DPB 项。