微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Delphi 2007解码UTF-8编码的西里尔文

我正在使用Delphi 2007(没有Unicode支持),我正在从Google AnalyticsAPI中检索 XMLJSON数据.下面是我为URL引用路径获得的一些UTF-8编码数据:

ga:referralPath=/add/%D0%9F%D0%B8%D0%B6%D0%B0%D0%BC

当我使用this decoder对其进行解码时,它会正确生成

ga:referralPath=/add/Пижам

有没有我可以在Delphi 2007中使用的函数来执行这种解码?

UPDATE
该数据对应于URL.最终我想要做的是将它存储在sqlServer数据库中(开箱即用 – 没有针对字符集修改设置).然后能够生成/创建一个带有此页面工作链接的html页面(注意:我只处理此示例中的url引用路径 – 显然要创建一个有效的url链接,需要一个代码).

解决方法

D2007支持Unicode,只是达不到D2009的程度. D2007中的Unicode使用WideString和确实存在的少数RTL支持函数来处理.

URL包含百分比编码的UTF-8字节八位字节.只需将这些序列转换为二进制表示,然后使用UTF8Decode()将UTF-8数据解码为WideString.例如:

function HexToBits(C: Char): Byte;
begin
  case C of
    '0'..'9': Result := Byte(Ord(C) - Ord('0'));
    'a'..'f': Result := Byte(10 + (Ord(C) - Ord('a')));
    'A'..'F': Result := Byte(10 + (Ord(C) - Ord('A')));
  else
    raise Exception.Create('Invalid encoding detected');
  end;
end;

var
  sURL: String;
  sWork: UTF8String;
  C: Char;
  B: Byte;
  wDecoded: WideString;
  I: Integer;
begin
  sURL := 'ga:referralPath=/add/%D0%9F%D0%B8%D0%B6%D0%B0%D0%BC';
  sWork := sURL;
  I := 1;
  while I <= Length(sWork) do
  begin
    if sWork[I] = '%' then
    begin
      if (I+2) > Length(sWork) then
        raise Exception.Create('Incomplete encoding detected');
      sWork[I] := Char((HexToBits(sWork[I+1]) shl 4) or HexToBits(sWork[I+2]));
      Delete(sWork,I+1,2);
    end;
    Inc(I);
  end;
  wDecoded := UTF8Decode(sWork);
  ...
end;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐