function StrToGBC(mStr: string): string; { 返回汉字所对应的区位码 } begin if Length(mStr) = 2 then Result := FormatFloat('00', Ord(mStr[1]) - cMinGBCByte + 1) + FormatFloat('00', Ord(mStr[2]) - cMinGBCByte + 1) else Result := ''; end; { StrToGBC }
function GBCToStr(mStr: string): string; { 返回区位码所对应的汉字 } var I, J: Integer; begin I := StrToIntDef(mStr, 0); J := I mod 100; I := I div 100; I := I + cMinGBCByte - 1; J := J + cMinGBCByte - 1; Result := Chr(I) + Chr(J) end; { GBCToStr }
procedure TForm1.Button1Click(Sender: TObject); begin Caption := GBCToStr(Edit1.Text) end;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
cMinGBCByte = 161; //最小国标字节
cMaxGBCByte = 254; //最大国标字节
function StrToGBC(mStr: string): string; { 返回汉字所对应的区位码 }
begin
if Length(mStr) = 2 then
Result := FormatFloat('00', Ord(mStr[1]) - cMinGBCByte + 1)
+ FormatFloat('00', Ord(mStr[2]) - cMinGBCByte + 1)
else Result := '';
end; { StrToGBC }
function GBCToStr(mStr: string): string; { 返回区位码所对应的汉字 }
var
I, J: Integer;
begin
I := StrToIntDef(mStr, 0);
J := I mod 100;
I := I div 100;
I := I + cMinGBCByte - 1;
J := J + cMinGBCByte - 1;
Result := Chr(I) + Chr(J)
end; { GBCToStr }
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GBCToStr(Edit1.Text)
end;
end.
自然,所需要的是MultiByteToWideChar;
其实使用Byte Array来表示unicode是不合理的,因为任何一个Unicode(这里说的Unicode是指的UTF-16)都由2个字节组成。如果只是为了某种应用目的的话,完全可以使用WideString来转换。var
Ansi_Str: String;
Wide_Str: WideString;
WideChar_Byte_Array: Array of Byte;
begin
Ansi_Str := '测试数据ABC';
Wide_Str := Ansi_Str;//转为Unicode
//字节数 = Unicode字数 * Unicode单字的字节数
SetLength(WideChar_Byte_Array, Length(Wide_Str) * sizeof(WideChar));
//复制到字节数组当中
Move(PChar(Wide_Str)^, WideChar_Byte_Array[0], Length(Wide_Str) * sizeof(WideChar)); //释放字节数组
SetLength(WideChar_Byte_Array, 0);
WideChar_Byte_Array := Nil;
end;
Ansi_Str: String;
WideChar_Byte_Array: Array of Byte;
iRet: Integer;
begin
Ansi_Str := '测试数据ABC';
//假定目标字节数 = AnsiCode字数 * Unicode单字的字节数
SetLength(WideChar_Byte_Array, Length(Ansi_Str) * sizeof(WideChar));
iRet := MultiByteToWideChar(936, 0, PChar(Ansi_Str), Length(Ansi_Str), PWideChar(@WideChar_Byte_Array[0]), Length(Ansi_Str) * sizeof(WideChar));
//iRet 返回的是实际的Unicode字数,所需要根据iRet设置字节数组的有效长度
SetLength(WideChar_Byte_Array, iRet * sizeof(WideChar)); //释放字节数组
SetLength(WideChar_Byte_Array, 0);
WideChar_Byte_Array := Nil;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ss:olevariant;
Ansi_Str: String;
Wide_Str: WideString;
WideChar_Byte_Array: Array of Byte;
begin
Ansi_Str := '测试数据ABC';
Wide_Str := Ansi_Str;//转为Unicode
//字节数 = Unicode字数 * Unicode单字的字节数
SetLength(WideChar_Byte_Array, Length(Wide_Str) * sizeof(WideChar));
//复制到字节数组当中
Move(PChar(Wide_Str)^, WideChar_Byte_Array[0], Length(Wide_Str) * sizeof(WideChar)); ss:= WideChar_Byte_Array; vt1.CodePage:= 20127;
vt1.Display(ss);
//释放字节数组
SetLength(WideChar_Byte_Array, 0);
WideChar_Byte_Array := Nil;
end;其中vt1就是我要显示中文的终端仿真控件,显示的是VT320.现在就是它显示不了中文,就是那个PowerTCP Emulation for ActiveX的终端显示控件。