实在不懂Delphi,请看一下下面这个程序,可不可以描述一下程序的原理是怎么实现的,因为本人想用C来完成同样的功能,谢谢!

解决方案 »

  1.   

    function Encode2(var s: WideString): String;
    var
    i, len: Integer;
    cur: Integer;
    t: String;
    begin
    Result := '';
    len := Length(s);
    i := 1;
    while i <= len do
    begin
    cur := Ord(s[i]);
    //BCD转换
    FmtStr(t, '%4.4X', [cur]);
    Result := Result+t;
    inc(i);
    end;
    end;
      

  2.   

    function Encode2(var s: WideString): String;
    var
    i, len: Integer;
    cur: Integer;
    t: String;
    begin
    Result := '';
    len := Length(s);
    i := 1;
    while i <= len do
    begin
    cur := Ord(s[i]);
    //BCD转换
    FmtStr(t, '%4.4X', [cur]);
    Result := Result+t;
    inc(i);
    end;
    end;
      

  3.   


    function Encode2(var s: WideString): String; 
    var 
    i, len: Integer; 
    cur: Integer; 
    t: String; 
    begin 
    Result := ''; 
    len := Length(s); //字符串的长度,在C中一般用字符数组来表示字符串
    i := 1; 
    while i <= len do 
    begin 
    cur := Ord(s[i]); //取字符串第i个字符的ASC码 比如字符'1',cur = Ord('1') = 49 ;
    //BCD转换 
    FmtStr(t, '%4.4X', [cur]); //这个表示格式输出 相当于C中的Format
    Result := Result+t; 
    inc(i); // Inc相当于C中的 ++, inc(i) 等价于c总的i++
    end; 
    end;不知道这样讲 你清楚了没?
      

  4.   

    这个Encode2函数是用来返回字符串中每个字符的Unicode编码(十六进制)的。比如:
    Encode2('中')    返回 4E2D
    Encode2('国')    返回 56FD
    Encode2('中国')  返回 4E2D56FD
      

  5.   


    function Encode2(s: WideString): String;
    var
      i, len: Integer;
      cur   : Integer;
      t     : String;
    begin
      Result := '';
      len := Length(s);    //获得字符串中的字符个数,因为是WideString,所以每个汉字、英文字符都算作一个字符
      i := 1;
      while i <= len do
      begin
        cur := Ord(s[i]);            //获得某个字符的Unicode编码
        //BCD转换
        FmtStr(t, '%4.4X', [cur]);   //转换成四位十六进制形式
        Result := Result + t;
        inc(i);
      end;
    end;
      

  6.   

    谢谢大家,看来是Delphi里面封装好的函数,先找一下帮助文件,看一下是怎么实现的……
      

  7.   

    简单写了下,vc6下正常。。void Encode2(IN wchar_t * pWsString, OUT char *ppResult)
    {
    for(ULONG dwLoop = 0;dwLoop < wcslen(pWsString); dwLoop++)
    {
    sprintf(ppResult, "%04X", pWsString[dwLoop]);
    ppResult += 4;
    }
    }
    void main()
    {
    wchar_t wcDbg[1024];
    wcscpy(wcDbg, L"13我1234567"); //测试数据
    char oResult[1024 * 4];        //这个保存结果     
            ZeroMemory(&oResult, sizeof(oResult));
    Encode2(wcDbg, oResult); return;
    }
      

  8.   

    原理很简单,宽字符每个占2个字节,算法把每个字节转成16进制的ASCII码
      

  9.   

    读源码:system.pasprocedure _WStrToString(Dest: PShortString; const Source: WideString; MaxLen: Integer);
    var
      SourceLen, DestLen: Integer;
      Buffer: array[0..511] of Char;
    begin
      SourceLen := Length(Source);
      if SourceLen >= 255 then SourceLen := 255;
      if SourceLen = 0 then DestLen := 0 else
      begin
        DestLen := WideCharToMultiByte(0, 0, Pointer(Source), SourceLen,
          Buffer, SizeOf(Buffer), nil, nil);
        if DestLen > MaxLen then DestLen := MaxLen;
      end;
      Dest^[0] := Chr(DestLen);
      if DestLen > 0 then Move(Buffer, Dest^[1], DestLen);
    end;
    function StringToWideChar(const Source: string; Dest: PWideChar;
      DestSize: Integer): PWideChar;
    begin
      Dest[MultiByteToWideChar(0, 0, PChar(Source), Length(Source),
        Dest, DestSize - 1)] := #0;
      Result := Dest;
    end;
      

  10.   

    WideCharToMultiByte
    MultiByteToWideChar
    都是windows API
      

  11.   

    Windows下是调用API WideCharToMultiByte/MultiByteToWideCharLinux下是对iconv库的调用友情提示,作为一个C/C++程序员,你并不像某些Delphi开发必须依赖非Unicode的VCL库做界面。所以你不应该去进行任何Unicode到非Unicode的转换,这会让你的Unicode程序失去Unicode的意义。