怎么将\xbe\xad\xd1\xe9 这样的字符转换成汉字

gomilk 2018-06-14 10:18:23
请教大神,怎么将文件中类似这样的字符串\xbe\xad\xd1\xe9 转换成汉字
...全文
3127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyc19941209 2019-10-17
  • 打赏
  • 举报
回复
\xe5\xbc\xa0\xe5\xae\x87\xe5\xb7\x9d
BlueStorm 2018-11-19
  • 打赏
  • 举报
回复

procedure TForm1.Button1Click(Sender: TObject);
var
  Len: Integer;
  Str, Rst: String;
  Buffer: TBytes;
begin
  Str := StringReplace('\xbe\xad\xd1\xe9', '\x', '', [rfReplaceAll]);
  Len := Str.Length div 2;
  SetLength(Buffer, Len);
  HexToBin(PChar(Str), Buffer, Len);
  Rst := TEncoding.Ansi.GetString(Buffer);
  ShowMessage(Rst);
end;
doloopcn 2018-11-19
  • 打赏
  • 举报
回复
\xbe\xad\xd1\xe9------这些都是十六进制的ASCII码,只需要将分隔符'\'变为0就是DELPHI字符串的ASCII码
0xbe0xad0xd10xe9
中文结果是:经验
.........
function DelimitedStrToHexStr(const Value: AnsiString;Delimiter:AnsiChar):AnsiString;
var
I: Integer;
begin
Result := Value;
for I := 1 to Length(Value) do
if (Value[i]=Delimiter) then
Result[i] := '0';
end;
function HexToStr(Value: AnsiString): AnsiString;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Value) do
begin
if ((I mod 4) = 1) then
begin
Result := Result + AnsiChar(StrToInt(Copy(Value, I, 4)));
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:= DelimitedStrToHexStr(Trim(Edit1.Text),'\');
Memo1.Lines.Add(HexToStr(Edit2.Text));
end;
天行归来 2018-06-15
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
直接move不行,他那个串里的be、ad之类的是字符,不是数字
嗯,move前提是要把哪些字符串的16进制先做转化成整型。
pathletboy 2018-06-15
  • 打赏
  • 举报
回复
function Convert(const s: AnsiString): AnsiString;
type
  ConvertState = (SCAN_SLASH, SCAN_X, PARSE);
var
  i: Integer;
  state: ConvertState;
  b: array[0..1] of byte;
  parseOrd: Byte;
  resultOrd: Integer;
begin
  SetLength(Result, Length(s) div 4);
  resultOrd := 1;
  state := SCAN_SLASH;
  for i := 1 to Length(s) do
  begin
    case state of
      SCAN_SLASH:
        if s[i] = '\' then
        begin
          state := SCAN_X;
        end;
      SCAN_X:
        if s[i] = 'x' then
        begin
          state := PARSE;
          parseOrd := 0;
        end
        else if s[i] = '\' then
        begin
          //pass
        end
        else
          state := SCAN_SLASH;

      PARSE:
        begin
          if s[i] in ['0'..'9'] then
          begin
            b[parseOrd] := Ord(s[i]) - Ord('0');
          end
          else if s[i] in ['a'..'f'] then
          begin
            b[parseOrd] := Ord(s[i]) - Ord('a') + 10;
          end
          else if s[i] in ['A'..'F'] then
          begin
            b[parseOrd] := Ord(s[i]) - Ord('A') + 10;
          end
          else if s[i] = '\' then
          begin
            state := SCAN_X;
            Break;
          end
          else
          begin
            state := SCAN_SLASH;
            Break;
          end;

          if parseOrd >= 1 then
          begin
            Result[resultOrd] := AnsiChar((b[0] shl 4) or b[1]);
            Inc(resultOrd);
            state := SCAN_SLASH;
          end
          else
            Inc(parseOrd);
        end;
    end;
  end;
end;
ShowMessage(Convert('\xbe\xad\xd1\xe9'))
lyhoo163 2018-06-15
  • 打赏
  • 举报
回复
这种格式,Rich文本带格式的字符,就是如此。如果是这样的话,比较好用的容易的办法,支持Rich文件的控件,读入后,再转出来。
  • 打赏
  • 举报
回复
可以用StrToInt('$' + ...);转换,但是效率较差,每转换一个字节要调用一次StrToInt,可以考虑查表法直接转换。
  • 打赏
  • 举报
回复
直接move不行,他那个串里的be、ad之类的是字符,不是数字
天行归来 2018-06-14
  • 打赏
  • 举报
回复
把16进制字符串转byte数组,再转string就出来了。 以下代码是证实string和byte[] 是可以互转

var
  tmp,s: string;
  buf: array of byte;
begin
  tmp := '中文字符串和byte数组互转';
  SetLength(buf,Length(tmp)*2);
  SetLength(s,Length(tmp));
  move(tmp[1],buf[0],Length(tmp)*2);
  move(buf[0],s[1],Length(tmp)*2);   //这里是你所需要的
  ShowMessage(s);
pzx521521 2018-06-14
  • 打赏
  • 举报
回复
参考php的做法 echo hex2bin(str_replace('\\x', '', '\xE6\x88\x91')); 把\x 全部替换后 百度 delphi 16进制转汉字 不过我转出来是乱码

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧