StringToWideStringEx,以一个指定的代码页将String向Unicode转换

翟二喜

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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: