关于UCS2和普通字符串的转换问题 ( 积分: 100 )

  • 主题发起人 主题发起人 SS2000
  • 开始时间 开始时间
S

SS2000

Unregistered / Unconfirmed
GUEST, unregistred user!
var s: string;
ws: WideString;

对于这两个变量的转化,Delphi作的很好,只需要
s := ws;
//or
ws := s;

就可以正确的把Ansi字符串转换成Wide(UCS2)字符串.

不过,有个问题却让我头疼,当收到的是 USC2 字符串内存的内容,
但是保存在一个string变量里面,如何转换成 USC2 字符串?
其实非常简单,但是不能用上面的方法,而是用内存复制.
SetLength(ws,Length(s) div 2)
Move(s[1],ws[1],length(s1));
呵呵,就这么简单,但是,却把我搞惨了,因为,我收到的UCS2编码
是从联通手机发上来的,它的UCS2编码的俩个字节顺序是相反的!!

以下是我收到的联通手机的USC2编码的真实内容
004F6062535F007684662F5E788FD0000A4F60653652307684662F795D798F000A4F60770B52307684662F5E0C671B000A4F6063094E0B7684662F54097965000A4F604F534F1A7684662F7F8E597D000A4F60611F89C97684662F6E2999A8000A795D4F6057238BDE5FEB4E500020514365E65FEB4E5000200020592959295FEB4E5000

注意 这是16进制编码,使用的时候先要转换成内存数据.
注意 头两个00没用和后两个00,必须去掉,我也不知道为什么(谁知道请告诉我)

下面是显示代码,你会得到一个惊喜.

procedure TForm1.Button4Click(Sender: TObject);
var s,s2: string;
i,len: integer;
us: string;
ch: array[0..1] of byte;
begin
s := '4F6062535F007684662F5E788FD0000A4F60653652307684662F795D798F000A4F6077' +
'0B52307684662F5E0C671B000A4F6063094E0B7684662F54097965000A4F604F534F1A' +
'7684662F7F8E597D000A4F60611F89C97684662F6E2999A8000A795D4F6057238BDE5F' +
'EB4E500020514365E65FEB4E5000200020592959295FEB4E50';
len := Length(s);
for i := 0 to len div 4 - 1 do
begin
s2 := Copy(s,i*4+1,2);
ch[1] := StrToInt('$' + s2);
s2 := Copy(s,i*4+3,2);
ch[0] := StrToInt('$' + s2);
us := us + WideChar(ch);
end;
showmessage(us);
end;
 
var s: string;
ws: WideString;

对于这两个变量的转化,Delphi作的很好,只需要
s := ws;
//or
ws := s;

就可以正确的把Ansi字符串转换成Wide(UCS2)字符串.

不过,有个问题却让我头疼,当收到的是 USC2 字符串内存的内容,
但是保存在一个string变量里面,如何转换成 USC2 字符串?
其实非常简单,但是不能用上面的方法,而是用内存复制.
SetLength(ws,Length(s) div 2)
Move(s[1],ws[1],length(s1));
呵呵,就这么简单,但是,却把我搞惨了,因为,我收到的UCS2编码
是从联通手机发上来的,它的UCS2编码的俩个字节顺序是相反的!!

以下是我收到的联通手机的USC2编码的真实内容
004F6062535F007684662F5E788FD0000A4F60653652307684662F795D798F000A4F60770B52307684662F5E0C671B000A4F6063094E0B7684662F54097965000A4F604F534F1A7684662F7F8E597D000A4F60611F89C97684662F6E2999A8000A795D4F6057238BDE5FEB4E500020514365E65FEB4E5000200020592959295FEB4E5000

注意 这是16进制编码,使用的时候先要转换成内存数据.
注意 头两个00没用和后两个00,必须去掉,我也不知道为什么(谁知道请告诉我)

下面是显示代码,你会得到一个惊喜.

procedure TForm1.Button4Click(Sender: TObject);
var s,s2: string;
i,len: integer;
us: string;
ch: array[0..1] of byte;
begin
s := '4F6062535F007684662F5E788FD0000A4F60653652307684662F795D798F000A4F6077' +
'0B52307684662F5E0C671B000A4F6063094E0B7684662F54097965000A4F604F534F1A' +
'7684662F7F8E597D000A4F60611F89C97684662F6E2999A8000A795D4F6057238BDE5F' +
'EB4E500020514365E65FEB4E5000200020592959295FEB4E50';
len := Length(s);
for i := 0 to len div 4 - 1 do
begin
s2 := Copy(s,i*4+1,2);
ch[1] := StrToInt('$' + s2);
s2 := Copy(s,i*4+3,2);
ch[0] := StrToInt('$' + s2);
us := us + WideChar(ch);
end;
showmessage(us);
end;
 
使用这个函数解码短信
function Ucs2ToString(UCS2: array of Char): string;
var
i: integer;
begin
i := 0;
Result := '';
while i < High(UCS2) do
begin
Result := Result+UCS2[i+1];
Result := Result+UCS2;
Inc(i,2);
end;
Result := WideCharToString(pWideChar(Result));
end;
 

Similar threads

回复
0
查看
848
不得闲
回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部