最近比较郁闷,网络上查到这段代码
近在做一个短信相关的项目。从联通网关deliver过来的短信都是ucs2编码的。在网上找了些资料,找到一些使用java语言本身带的api转换的代码,但没有合适的delphi源码,所以经研究后自己写了一个,很简单的:function Ucs2ToGBK(const InValue: string): string;
var
  I: Integer;
begin
  Result := '';
  for I := 1 to length(InValue) div 2 - 1 do
    Result := Result + WideChar(StrToInt('$' + IntToHex(Ord(InValue[2 * I - 1]), 2)
                                             + IntToHex(Ord(InValue[2 * I]), 2)));
end;事实上,这段代码可解汉字,不能解英文和数字,有误.我修改之后:
function Ucs2ToGBK(const InValue: string): string;
var
  I: Integer;
      begin
        for i := 1 to length(InValue) div 2 - 1 do
        begin
          if StrToInt('$' + inttohex(Ord(InValue[2 * i - 1]), 2) + inttohex(Ord(InValue[2 * i]), 2)) >= 9999 then
          begin
(str0<>'‵')  then begin
            result := result + WideChar(StrToInt('$' + inttohex(Ord(InValue[2 * i - 1]), 2)
              + inttohex(Ord(InValue[2 * i]), 2)));
          end else
          begin
            result := result + WideChar(StrToInt('$' + inttohex(Ord(InValue[2 * i]), 2)));
          end;
        end;
      end;
end;
能解码汉字和英文混合但问题是,有误码,例如把"大"解成"梦".证明是有问题的.结果,交给同时,用JAVA,只有一个函数就搞正确了,是UFT-16BE的格式码(UCS2的一种).而DELPHI确实没有.我现在在写DELPHI版本的网关,已经接通了SMGP,CMPP,还差联通,写好之后,可能年后会公布程序的....
现在很郁闷的,DELPHI版本的短信网关,,,居然,,不流行,都是C,JAVA的....DELPHI难道就?'N    '
'Y"   '
'`╲?QN?NS厲廹:[苮f/ 0 4 8 2 8 7 嬿彄Qe|麀?嬪[苮N艝Pg,k!Ou(0 '
上面三个码,谁能解正确?请回复..谢谢!万分感谢.

解决方案 »

  1.   

    UTF-16是一种压缩编码,用UCS2字符编码UCS4字符,就象UTF-8是用ASCII编码UCS2(unicode)字符一样。
    所以它不能叫作“UCS2”,严格意义上的UCS2是指统一字符集的16-bit原生编码,也叫unicode(事实上是先有了unicode,后有的ISO-10646)。
    你下载一个JCL库就好了,有各种编码之间转换的过程(Delphi的一个优点就是不管什么代码,只要你去找,就几乎肯定能找到free、opensource的东西 :)。
    在www.delphi-jedi.org
      

  2.   

    看不懂啊...我去下了,没有找到UTF-16的.
      

  3.   

    忘了说在jclunicode.pas中。:)
      

  4.   

    UCS2<->ANSI根本不用自己转,String/WideString强类型转换,编译器自动完成相关API调用,只要是中文环境,也就是codepage正确就行,会自动完成调用MultiByteToWideChar/WideCharToMultiByte的代码UTF-16和UCS2根本两码事,没有关系,说是UCS2的一种说明你自己连基本概念都没搞清楚,建议先google扫扫盲,做些基础知识储备先。UTF-16需要先Decode成UCS2先,这个代码随便google下,很容易找到。如果是UTF-8,VCL里有现成的函数。
      

  5.   

    ehom(?!) 
    帮个忙,,,我现在走如死胡同了,,搞不定.......
    能不能给点代码?我黑晕..
      

  6.   

    谢谢各位,问题已经解决,一点小故障可能是因为,我用文件方式来缓存DIERVER过来的消息,而后,再取文件内容来解码,这个时候源文件已经不对了.
    我采取,收到网络过来的DLIVER的时候,立即解码,再缓存方式,成功.
    以下为解码函数:
      function DecodeWideString1(Value: string): WideString;
      var
        i: integer;
        S: string;
      begin
        S := '';
        for i := 1 to length(Value) do
          S := S + IntToHex(Byte(Value[i]), 2);
        Value := S;
        result := '';
        for i := 0 to (length(Value) div 4) - 1 do
        begin
          result := result + WChar(StrToInt('$' + Value[i * 4 + 1] + Value[i * 4 + 2]) shl 8
            + StrToInt('$' + Value[i * 4 + 3] + Value[i * 4 + 4]));
        end;
      end;
    不过奇怪的是,即使如此,我把这个错误的码用JAVA的内置函数也可以正确解出.
    费解,看来DELPHI没有完的啦....