delphi 中英文字符串与字节数组 互转

buf:arrayofByte;str:='中文abc';1、怎样把含中英文字符串str保存到buf中,且只占7个字节。即一个中文字符占2个字节,1个英文占1个字节?方法... buf : array of Byte;str := '中文abc';1、怎样把含中英文字符串 str 保存到 buf 中,且只占7个字节。即一个中文字符占2个字节,1个英文占1个字节?
方法一:
iPos := 0;
SetLength(buf, Length(str) * 2);// 预设 2 倍大小
for i:=1 to Length(str) do begin //区分单双字节 if ByteType(str,i) = mbSingleByte then begin Move(str[i], buf[iPos], 1); Inc(iPos); end else if ByteType(str,i)= mbLeadByte then begin Move(str[i], buf[iPos], 2); Inc(iPos,2); end; end;
//buf[0...iPos] 就是所要的 byte 数组

2、怎样上述的buf[0...iPos]解析出来,保存到一个string 变量中?

请前辈给个具体代码,
没分了,悬赏不了,不好意思
展开
 我来答
至少让我看一眼
推荐于2018-04-11 · TA获得超过451个赞
知道小有建树答主
回答量:188
采纳率:0%
帮助的人:241万
展开全部

你的Delphi是不是Delphi2009以上的版本,如果是的话默认的String是WideString.你所说的7个字节的String事实上是AnsiString。方法一事实上可以简化为:

const
  str: AnsiString = '中文abc';
var
  buf: array of Byte; len: Integer;
begin
  //获取ansi字符串的长度
  len := Length(str);
  //设置buf数组的长度
  SetLength(buf,len);
  //复制数据到buf数组
  Move(str[1],buf[1],len);
end;

而复制buf的方法,就是上面方法的反操作:

const
  str: AnsiString = '中文abc';
var
  buf: array of Byte; len: Integer;

  astr: AnsiString; trgStr: String;
begin
  //获取ansi字符串的长度
  len := Length(str);
  //设置buf数组的长度
  SetLength(buf,len);
  //复制数据到buf数组
  Move(str[1],buf[1],len);

  //获取buf数组的长度
  len := Length(buf);
  //设置需要复制的Ansi字符串的长度
  SetLength(astr,len);
  //从buf数组复制数据
  Move(buf[1],astr[1],len);
  //将数据复制到trgStr字符串
  trgStr := astr;
  //显示trgStr
  ShowMessage(trgStr);
end;
cnsuyong
2013-12-29 · TA获得超过1075个赞
知道小有建树答主
回答量:767
采纳率:100%
帮助的人:434万
展开全部
Delphi 的 string 本来就是单字节保存,显示的时候由操作系统画布自动区分中文英文,你直接按字节取出来就可以。中文字符双字节的每个字节的值都大于等于 $80 ,西文字符的字节的值都小于 $80 。
追问

我用的是XE4,你说的很对,AnsiString类型能区别单双字节。学习了,3Q!!

你上面的代码,buf 下标应该从0开始吧,你可以调试看看。。。

  1.  Move(str[1],buf[0],len);

  2. //你的代码很整齐

追答
给你一个链接,希望有帮助。http://www.cnblogs.com/baoquan/articles/1027371.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式