您在问题中提到您正在将此数组数据类型中保存的数据发送到服务器。
如果该服务器实现在您的控制之下并且也正在升级到 Unicode,那么您只需要确保数据交换的双方就数据的内容达成一致。如果您需要一个数组来保存长度不超过 255 个字符的“字符串”(这是您的 ANSI 实现所支持的),那么您的 Unicode 版本也需要支持 255 个字符。变化的是每个字符所需的数据量 - 2 个字节,而不是 1 个(它并不那么简单,但我假设您的 ANSI 实现没有处理 MBCS 问题,并且您的 Unicode 实现同样不会' t 关心代理对(就影响有效“字符”的数量而言)。
即你的TRap数组应该是:
TRap = array[0..254] of WIDEChar;
但是,如果服务器实现不在您的控制之下(您观察到新代码必须继续与旧版本一起使用暗示了这一点),那么无论您在客户端应用程序中进行什么更改,服务器都将继续期待255 个ANSI字符。在这种情况下,您的TRap类型必须与以前保持相同(ANSIChar 数组),并且您必须确保在 WIDE 字符串字符传入和传出数组时将它们转换为 ANSI(反之亦然)。
注意:将 UTF-8 转换为该数组或任何其他设计只是为了使相同数量的字符“适合”是没有意义的,除非新代码将使用的旧版本服务器已经可以接收 UTF-8编码字符(根据手头的信息,它几乎肯定不会)。
回到服务器实现在您的控制之下的情况,您可能会保持对 ANSI TRap类型的支持,并通过在数据结构的新 WIDE char 版本中合并一个“magic cookie”来引入新的 WIDE char 实现允许服务器识别正在传递的数据结构类型并相应地进行调整。这些方面的东西:
TANSIRap = array[0..254] of ANSIChar;
TWIDERap = array[0..254] of WIDEChar;
// ANSIMovieData corresponds *exactly* to the old MovieData structure
PANSIMovieData = ^TANSIMovieData;
TANSIMovieData = packed record
rRap: TANSIRap;
rKey: string[7];
iID: integer;
end;
// WIDEMovieData adds a magic cookie "header" identifying the new structure type
PWIDEMovieData = ^TWIDEMovieData;
TWIDEMovieData = packed record
rCookie: Word;
rRap: TWIDERap;
rKey: string[7];
iID: integer;
end;
发送TWIDEMovieData时,将rCookie字段设置为某个不会出现在有效TANSIRap数组中的常量值。例如,如果“空” TRAp数组(即 ANSI 版本)全为 0,则$00FF的 cookie可能是合适的,因为没有有效的 ANSI 电影数据结构可以以前导 #0 字符开头紧跟 #ff 字符:
const
MOVIEDATA_WIDECOOKIE = $00FF;
// new client pseudo-code:
data: TANSIMovieData;
wdata: TWIDEMovieData;
if ANSI Server then
data... // init ANSI movie data (TANSIRap ANSI chars converted from WIDE)
SendToServer(data); // etc
else // WIDE server
wdata.rCookie := MOVIEDATA_WIDECOOKIE;
wdata..... // init WIDE movie data
SendToServer(wdata); // etc
// server pseudo-code:
var
data: PANSIMovieData;
wdata: PWIDEMovieData;
ReceiveDataIntoBuffer(data^);
wdata := PWIDEMovieData(data);
if wdata.rCookie = MOVIEDATA_WIDECOOKIE then
HandleWideData(wdata)
else
ExistingANSIDataHandler(data);
唯一的问题是新客户端如何确定与之通信的服务器是否能够支持 WIDE 电影数据。但这只有在服务器实现在您的控制之下时才会成为问题(如果不是,那么您无论如何只能继续使用 ANSI),因此您应该能够设计一些机制来识别服务器功能,以使旧服务器能够可靠地运行被新客户识别。
绝对最坏的情况,您可能需要一个客户端配置设置(请注意,如果您将客户端配置为使用 ANSI,即使对于新服务器,它仍将继续工作,只是没有 Unicode 支持)。
New client / New server : client and server both use WIDE (but will also work with ANSI)
New client / Old server : client uses ANSI
Old client / New server : server detects ANSI
Old client / Old server : no change
根据服务器实现,您可能需要分阶段读取数据,根据传递的数据结构读取前 2 个字节以获得前两个TANSIRap字符或WIDECOOKIE,然后根据是否读取数据包中的剩余字节你检测到cookie与否,但原理本质上是一样的。