zoukankan      html  css  js  c++  java
  • kbmMWEncodeEscapes 中汉字编码的问题及解决办法

         kbmMWEncodeEscapes 是kbmmw 里面的一个函数,用来对URL 中的汉字进行编码,例如

    http://127.0.0.1/getname?name=春节,由于'春节'是汉字,浏览器向台发送请求时,会把这个连接转会为

    http://127.0.0.1/getdata?name=%B4%BA%BD%DA

    而kbmMWEncodeEscapes 就是实现转换的函数,但是由于D2009 以后,delphi 支持unicode。导致kbmMWEncodeEscapes

    在转换汉字时出现问题,不能正常转换。

    因此需要修改,经过修改后代码变成以下:

    function kbmMWEncodeEscapes(const AString:string):string;
    var
       i,l:integer;
       sb:TkbmMWStringBuilder;
       B: TBytes;
    begin
          B:=TEncoding.ANSI.GetBytes(AString);
         sb:=TkbmMWStringBuilder.Create;
         try
            l:=Length(b);
            for i:=0 to (l-1) do
            begin
                 if chr(b[i])=' ' then
                 begin
                      sb.Append('+');
                      continue;
                 end;
                 if not (chr(b[i]) in ['a'..'z', 'A'..'Z', '0'..'9', '_']) then
                 begin
                      sb.Append('%'+IntToHex(Ord(B[I]),2));
                      continue;
                 end;
                 sb.Append(chr(b[i]));
            end;
            Result:=sb.ToString;
         finally
            sb.Free;
         end;
    end;
    

     同样,由于解码函数也要进行相应的变化

    function kbmMWDecodeEscapes(const AString:string):string;
    var
       i,k,l:integer;
        B: TBytes;
    begin
         l:=Length(AString);
         if l<=0 then
         begin
              Result:='';
              exit;
         end;
         setlength(b,l);
         i:=1;
         k:=0;
          repeat
                if AString[i]='+' then
                  begin
                       b[k]:=ord(' '); 
                       inc(i);
                       inc(k);
                  end
                  else if AString[i]='%' then
                  begin
                      b[k]:=(Hex2Dec[ord(AString[i+1]) and $1F] shl 4)
                                +Hex2Dec[ord(AString[i+2]) and $1F];
                      inc(i,3);
                      inc(k);
                  end
                  else
                  begin
                       b[k]:=ord(AString[i]);
                       inc(i);
                       inc(k);
                  end;
            until i>l;
         setlength(b,k);
    
        result:=TEncoding.ANSI.GetString(b);
    
    end;
    

    其实,以上的转换是把汉字转换成对应windows codepage 的ansic 码值,为了更通用的目的

    可以使用以下函数进行编码:

    function URIEncode(const S: string ; Encoding : TEncoding): string;
    cURLUnreservedChars = ['A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.', '~'];
    var
       I: Integer;
       B: TBytes;
    begin
                result:='';
                B:=Encoding.GetBytes(S);
                for I := Low(B) to High(B) do
                 begin
                       if CharInSet(Chr(B[I]), cURLUnreservedChars) then
                       Result:=Result+WideChar(B[I]) else
                      Result:=Result+'%'+IntToHex(Ord(B[I]),2);
                 end;
    end;
    

     这个函数,你可以对 string 进行各种编码。以适合程序的应用。





  • 相关阅读:
    C++实现base64编码
    php实现base64编码
    美团2016研发工程师笔试题(绑鞋带问题)
    URL encode 与 URL decode 的C语言实现
    常用排序算法集合-C实现
    用文件实现计算器要求多进程同时写
    vim操作命令-笔记
    Can't connect to local MySQL server through socket
    小程序页面跳转数据丢失
    Vue路由 --登录状态的判断
  • 原文地址:https://www.cnblogs.com/xalion/p/3152106.html
Copyright © 2011-2022 走看看