unicode的转换问题(100分)

  • 主题发起人 主题发起人 abigfish
  • 开始时间 开始时间
A

abigfish

Unregistered / Unconfirmed
GUEST, unregistred user!
我们知道:汉字1->unicode,unicode->汉字2 结果汉字1=汉字2.
现在,我要的是任意的unicode码转成汉字,这些unicode大部分是不可见无规则的字符,然后再把这些无规则的字符通过汉字转化成unicode的办法,结果是前后两串unicode码的数据不一致.哪位高人知道这个问题的原因所在及解决办法
我的转换函数是:
function DecodeChinese(const InputStr: String): String;
var
I : Integer;
W : WideString;
begin
I := 0;
W := '';
while I < Length(InputStr) do
begin
W := W + WideChar(StrToInt('$'+Copy(InputStr, I+1, 4)));
Inc(I, 4);
end;

Result := W;
end;
function EncodeGb(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);
//BCD×&ordf;&raquo;&raquo;
FmtStr(t,'%4.4X',[cur]);
Result:=Result+t;
inc(i);
end;
end;
 
把下面代码复制回去:
// 转换:
function C(ch: Char): integer;
var
n:integer;
begin
n:=Ord(ch);
case n of
48..57 : Result:=n-48;
65..70 : Result:=n-55;
97..102 : Result:=n-87;
end;
end;

// 编码:
function EncodeGb(const S: WideString): string;
var
n:integer;
begin
if Length(S) > 0 then
begin
n:=1;
while n <= Length(S) do
begin
Result := Result + IntToHex(integer(S[n]),4);
inc(n);
end;
end;
end;

// 解码:
function DecodeChinese(const S: string): string;
var
n:integer;
begin
if (Length(S)>0)and((Length(S) mod 4)=0) then
begin
n:=1;
while n < Length(S) do
begin
Result:=Result + WideChar(C(S[n]) shl 12 +
C(S[n+1]) shl 8 + C(S[n+2]) shl 4 + C(S[n+3]));
inc(n,4);
end;
end;
end;

简单测试可以:
// 编码:
procedure TForm1.Button1Click(Sender: TObject);
var
FStr:WideString;
begin
FStr:='我们生长在中文的国度';
Edit1.Text:=EncodeGb(FStr);
end;

// 解码:
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text := DecodeChinese(Edit1.Text);
end;
 
谢谢楼上的回复,但是不行,我要的是
Edit2.Text := DecodeChinese('32114EEC751F957F57284E2D6587768456FD5EA5)'
Edit1.text :=EncodeGb(Edit2.Text);
最后edit1.text的结果应该还是32114EEC751F957F57284E2D6587768456FD5EA5
而不是003F4EEC751F957F57284E2D6587768456FD5EA5之类的.
我试过了手机是不存在这类问题的,我把随便的4的倍数的十六进制码发到手机上,然后用手机回复原内容,捕捉出的PDU码跟我发出去的是一样的,但是在Delphi里就不行了
 
你不认识英文没关系,反正我也不认识。但我写着的中文你还是不认识,那你到底认识哪国文字呢?诧异中.....

简单地说,你把我提供的函数用反了。复杂地说,就是:要对字符串“32114EEC751F957F57284E2D6587768456FD5EA5”进行编码再反编码,必须正确地先使用编码函数,再使用解码函数看解码结果。也就是说,你上面的行为,应该如下:

// 注意看,这个是编码函数
Edit2.Text := EncodeGb('32114EEC751F957F57284E2D6587768456FD5EA5)';

// 再注意看,这个才是解码函数。
Edit1.text :=DecodeChinese(Edit2.Text);

你再试试看。
 
唉,“书非借不能读”,看来代码也是一样,有得抄就根本不去看实现。如果到了封闭开发的时候,没得抄你怎么办呢?呵呵。只好把老板当鱿鱼抄了。

不想说,但我还是要补充一句:其实,99.9% 代码编写上的问题和 Delphi 没有关系,如果觉得 Delphi 不行,先要想想会不会就是落在了这个 99.9% 之中。
 
拜托了,别那么自以为是好不好,就这点转换我两年前就会了.

我的所谓的unicode码不是用哪一国语言转换而来的,而是用十六进制随机写出来的,这些数据是用在工业控制协议命令产生出来的.之前用MODEM直接把这些数字当成中文的unicode码发到串口中,现在在研究是否可以通过短信网关收发这些数据.如果要通过网关,必须先把这串数据转换成可见的中文字符,再发到网关,这时,如果网关无法将转换后可见的中文字符再原文转成原数据就麻烦了.
分不是那么好混的
 
呵呵呵呵,拉倒吧。如果为了混分,我就不会每年年底把自己的ID删除重新注册一遍了。

不过,我还是十分佩服你,就这点转换都需要问,甚至都已经告诉你该怎么做了,还是没明白。

看来,混,真的也是很辛苦的啊。
 
这样吧,
AT+CMGS=65

0011000D91683169108168F30008AA32115A5633300100010101F133F00A00FEE9AB7B1919BBAF8D5F180B31353936303230373333370B3135393630323037333337
里面的数据"115A5633300100010101F133F00A00FEE9AB7B1919BBAF8D5F180B31353936303230373333370B3135393630323037333337"是我要的,现在你通过你的编码把它转化为中文再从中文转化为unicode看看.如果你真的明白是怎么回事,且知道这是可以处理的,那这样的语气也就罢了,如果是连题目都没读懂的话,那该回去避门思过,不懂不是你的错,不懂装做很懂就是不可原谅
 
ha ha! 二位何必呢! 讨论问题应该对事不对人,本来是好事,一块讨论技术问题,现在变成有些人身攻击的味道,如果觉得别人的话说得自己不爱听,静静的离开也就是了,何必非要续帖,较劲呢?
 
建议楼主再找一下资料,我以前看到这方面的编码的,手机通信编程之类,没太在意,只记得对手机的数据要颠倒过来取的,详细的记不清楚了,找找看,网上有的。
 
这个是逆转换的编程,不是正常的手机短信编码问题,很少人真正去研究过这个问题的.有在手机制造商里研究手机软件的人应该知道.
 
看的下,小雨哥算得上是专家了,唉,可能是没认真看题,还是我没说清楚
 
后退
顶部