请大家帮我看看(关于字符转换的问题) ( 积分: 100 )

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

sad_sand

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在想把中文字符转化成Unicode码,再以16进制表示。例如:“你好”的Unicode码是“4F60 597D”,在机器码中表示成“0x4F 0x60 0x59 0x7D”(共4个字节)。我现在已经能把中文(例如“你好”)转换成Unicode码(“4F60 597D”),但是是一个字符串形式,在机器码中表示时成了8个字节,即(“0x34 0x46 0x36 0x30 0x35 0x39 0x37 0x44”)。请各位大虾帮忙看看怎么转换,多谢了!
不知我是否把问题说明白了?
 
我现在想把中文字符转化成Unicode码,再以16进制表示。例如:“你好”的Unicode码是“4F60 597D”,在机器码中表示成“0x4F 0x60 0x59 0x7D”(共4个字节)。我现在已经能把中文(例如“你好”)转换成Unicode码(“4F60 597D”),但是是一个字符串形式,在机器码中表示时成了8个字节,即(“0x34 0x46 0x36 0x30 0x35 0x39 0x37 0x44”)。请各位大虾帮忙看看怎么转换,多谢了!
不知我是否把问题说明白了?
 
function AnsiToUnicode(Ansi: string):string;
var
s:string;
i:integer;
j, k:string[2];
a:array [1..1000] of char;
begin
s:='';
StringToWideChar(Ansi, @(a[1]), 500);
i:=1;
while ((a<>#0) or (a[i+1]<>#0)) do begin
j:=IntToHex(Integer(a), 2);
k:=IntToHex(Integer(a[i+1]), 2);
s:=s+k+j;
i:=i+2;
end;
Result:=s;
end;
 
不知道你是要 4F60 597D 还是 0x34 0x46 0x36 0x30 0x35 0x39 0x37 0x44 ?
既然Unicode码出来了,在取每个字符的ASCII码应该很容易了
 
呵呵,可能我还是没把问题讲清楚。0x34 0x46 0x36 0x30 0x35 0x39 0x37 0x44是十六进制表示的。我现在想要0x4F 0x60 0x59 0x7D(十六进制)。但成了0x34 0x46 0x36 0x30 0x35 0x39 0x37 0x44。
 
AnsiToUnicode('你好') = '4F60 597D';

s:=s+k+j
改成 s := s + '0x' + k+ '0x' + j;
可以吗?
 
谢谢!但是还是不是那个意思。我想想该怎么说。。。。
 
16进制本身就是一个字符串,你可以在前面加一个$
比如 StrToInt('$4F') := 79;
 
可能我误导了你的思路了。
我的目的是通过串口发数据,怎样把中文数据转化成我需要的形式。
例如我想把“你好”转换成0x4F 0x60 0x59 0x7D(十六进制表示)。
它的规律是:4F 60 59 7D是“你好”的Unicode码,现在是字符串的形式,而delphi默认把它看成0x34 0x46 0x36 0x30 0x35 0x39 0x37 0x44(十六进制表示)。0x4F 0x60 0x59 0x7D(十六进制)表示成ASCII码也不是4F 60 59 7D。
我想是不是需要按位处理,并需要移位什么的,但我不知道delphi怎么表示位?
 
你需要定义成byte类型吧,然后一个一个发送
b : byte;
b := StrToInt('$4F');
 
b : Array[0..1024] of Byte
b[0] := StrToInt('$4F');
b[1] := StrToInt('$60');
....
 
嗯,谢谢!我试试。[:)]
我想再请教一下,我发送的是pchar类型的数据,如何表示呢?
 
c : array[0..1024] of char;
 
不好意思,我水平太差!
我的这个代码是:comm1.WriteCommData(SendStr,length(SendStr)),其中SendStr是pchar类型的,它发出的数据怎么能为上面说的形式?
 
不能把两个字转换成两个WORD字节吗?如:
'你好' => (20320, 22909)
inttohex(20320, 4) = '4F60'
inttohex(22909, 4) = '597D'
 
谢谢xianguo,问题已经解决。用#$47+#$60就可以了。我没把问题表达明白。
 
多谢xianguo和farsail的解答,我已经把分数送上,请查看。:)
 
后退
顶部