看有人说是用MultiByteToWideChar或WideCharToMultiByte。不知道用哪个,怎么用?往有人指点啊。

解决方案 »

  1.   

    unit   Unit1;   
        
      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.
      

  2.   

    通常说的中文,即为ANSI Code,也就是MultiByte Code;Unicode,即WideChar
    自然,所需要的是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;
      

  3.   

    其实是因为有一个显示控件,只接受单字节的内容,按照控件的文档说,我需要将自己的含中文的字符串转换成某种编码的byte数组,以olevariant传给控件,同时将我的编码的codepage告诉该控件,它会将其进行转换成多字节显示。那么我怎么才能将我的含中文的字符串转成,如codepage为20127 (US-ASCII)的二进制byte array.
      

  4.   

    一般情况下不需要直接调用MultiByteToWideChar和WideCharToMultiByte,这当中有一个代码页(Code Page)的问题,通常我们都直接使用默认的代码页,那跟WideString和String做一个转换没有任何差别。var
      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;
      

  5.   

    你直接把你的String复制到Byte Array当中传Code Page为936.
      

  6.   

    我将按照unsigned 给的代码,贴这,
    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的终端显示控件。
      

  7.   

    呵呵,unsigned 按你说的,不显示乱码了,却显示的黑色的空格。我估计PowerTCP Emulation for ActiveX的终端显示控件不支持中文吧。