转回来的也是Utf8String啊你是怎么理解utf8的呢 s 转到b 再转d 你认为s=d 你是表达这个意思吧。 ord char这只是对 ansic码适用,你这样会丢字节你要做的不是很简单 你已经得到了uft8的 s 把s写成byte不就行了吗 for i := 1 to len do begin b[i-1] := ord(s[i]); end; 你这个就已经错了
var s: UTF8String; b: array [0..1024] of byte; begin s := 'abcd汉字'; move(s[1], b, length(s)); end;
array of byte转成string呢?现在主要是转出来会乱码
array of byte转成string呢?现在主要是转出来会乱码
转回来的也是Utf8String啊你是怎么理解utf8的呢 s 转到b 再转d 你认为s=d 你是表达这个意思吧。 ord char这只是对 ansic码适用,你这样会丢字节你要做的不是很简单 你已经得到了uft8的 s 把s写成byte不就行了吗 for i := 1 to len do begin b[i-1] := ord(s[i]); end; 你这个就已经错了
其实d是服务器发过来的数据,里边包括中文
首先你要知道你转换它干什么?如果只是要复制走,那可以用move,如果只是以另一种方式访问,既没必要转换,也没必要复制,Delphi有一个非常NB的特性,可以给一个变量声明其他类型的别名: var s: string; p: PByte absolute s; i: integer; //... s := Edit2.Text; for i := 0 to Length(s) * SizeOf(char) - 1 do // p[i] 现在表示s的一个字节
d:array of byte d是从服务器里发过来的,是utf8串转成的数组,我收到后要将期还原成string串,里边会包含中文,现在的问题是,还原过来后,中文部分全变成乱码了 还有,这个程序是跑在android下的, p: PByte absolute s;这东西能在android下用吗?
如果你确保接收的d缓冲区数据和长度都没问题的话,那是很简单的:var c: array of AnsiChar absolute d; // alias for d s: UTF8String; // ... s := PAnsiChar(c); // convert input data to UTF8 string
XE5下,你确定这个能用? DelphiGuy的应该没有问题吧,不过这样写要注意末尾需要有#0
没问题,不需要0终止也可以的,比如:var d: array of byte; c: array of AnsiChar absolute d; // alias for d s: UTF8String; // ... SetLength(d, 6); d[0] := $e4; d[1] := $b8; d[2] := $ba; d[3] := $e4; d[4] := $b8; d[5] := $bb; // d中是“为主”二字的UTF8编码 s := PAnsiChar(c); ShowMessage(s);
xe5的,因为上家要求,必须转成byte数组发到服务器上验证
s 转到b 再转d 你认为s=d 你是表达这个意思吧。 ord char这只是对 ansic码适用,你这样会丢字节你要做的不是很简单 你已经得到了uft8的 s 把s写成byte不就行了吗
for i := 1 to len do
begin
b[i-1] := ord(s[i]);
end; 你这个就已经错了
s: UTF8String;
b: array [0..1024] of byte;
begin
s := 'abcd汉字';
move(s[1], b, length(s));
end;
array of byte转成string呢?现在主要是转出来会乱码
array of byte转成string呢?现在主要是转出来会乱码
s 转到b 再转d 你认为s=d 你是表达这个意思吧。 ord char这只是对 ansic码适用,你这样会丢字节你要做的不是很简单 你已经得到了uft8的 s 把s写成byte不就行了吗
for i := 1 to len do
begin
b[i-1] := ord(s[i]);
end; 你这个就已经错了
其实d是服务器发过来的数据,里边包括中文
var
s: string;
p: PByte absolute s;
i: integer;
//...
s := Edit2.Text;
for i := 0 to Length(s) * SizeOf(char) - 1 do
// p[i] 现在表示s的一个字节
d:array of byte
d是从服务器里发过来的,是utf8串转成的数组,我收到后要将期还原成string串,里边会包含中文,现在的问题是,还原过来后,中文部分全变成乱码了
还有,这个程序是跑在android下的, p: PByte absolute s;这东西能在android下用吗?
c: array of AnsiChar absolute d; // alias for d
s: UTF8String;
// ...
s := PAnsiChar(c); // convert input data to UTF8 string
XE5下,你确定这个能用?
DelphiGuy的应该没有问题吧,不过这样写要注意末尾需要有#0
d: array of byte;
c: array of AnsiChar absolute d; // alias for d
s: UTF8String;
// ...
SetLength(d, 6);
d[0] := $e4;
d[1] := $b8;
d[2] := $ba;
d[3] := $e4;
d[4] := $b8;
d[5] := $bb; // d中是“为主”二字的UTF8编码
s := PAnsiChar(c);
ShowMessage(s);
PAnsiChar会一直读直到遇到#0,不想加#0的话可以直接Move
d[0] := $41;
d[1] := $42;
d[2] := $43;
d[3] := $44;
d[4] := $45;
d[5] := $46;
这个没有0了吧,一样可以的。另外,我发现,实际上可以直接:s := PAnsiChar(d);也没有问题的。
可能出现问题的是这种情况:
SetLength(d, 6);
...
SetLength(d, 4);
...
s := PAnsiChar(d);
此时转换后仍然得当了长度为6的串,前4个字符是正确的,后面两个是之前遗留的。
唯一可能出现问题的情况就是我前面说的,把动态数组改小(改大没有问题),而且大小和之前的差不多,此时转换出来的串是上一次的长度。
SetLength(s, Length(d));
StrLCopy(PAnsiChar(s), PAnsiChar(d), Length(b));