Delphi 自身是可以实现 aWideString := aString 的转换的。但是,这样的转换,需要 aString 以当前应用程序(或是操作系统?)的默认字符集可识别的形式存在。换句话说,如果 aString 中存储的是 Big5 字符集的Ansi字符串,在 gb2312 字符集的应用程序(或是操作系统?)的 aWideString := aString 这样形式的转换就会出问题的。
为此,编写下面的函数以解决这个问题,向上面的这个例子可以这样调用:
aWideString := StringToWideStringEx( aString, 950 );
950 是 Big5 字符集的代码页编号,gb2312 是 936,有关代码页编号请参阅相关文档。
函数全文:
function StringToWideStringEx(const strAnsiSource: AnsiString; nCodePage: Integer): WideString;
var
arrAnsiChars: array of AnsiChar;
arrWideChars: array of WideChar;
nBufferSize: Integer;
begin
SetLength( arrAnsiChars, Length(strAnsiSource) + 1 );
StrPLCopy( @arrAnsiChars[0], strAnsiSource, Length(strAnsiSource) );
nBufferSize := MultiByteToWideChar( nCodePage, 0, @arrAnsiChars[0], -1, nil, 0 );
SetLength( arrWideChars, nBufferSize );
MultiByteToWideChar( nCodePage, 0, @arrAnsiChars[0], -1, @arrWideChars[0], nBufferSize + 1 );
Result := PWideChar( @arrWideChars[0] );
end;
没脾气2x,2004-5