DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xieqiongxi1
今日帖子: 0
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/20 19:12:35
标题:
有人用ICS 8吗?遇到关于文件名乱码的难题了 浏览:2615
加入我的收藏
楼主: 我用ICS8+XE5,下载百度文库的文件,文件网址如下:
 http://wapwenku.baidu.com/download/f052a2d933d4b14e852468e0?ssid=&from=&bd_page_type=1&uid=8BA0D668FD34ECB251B77593F4193E02&pu=rc@1,pic@on,sl@1,pw@1000,sz@1509_320,pd@1,fz@2,lp@1,tpl@color,&st=1&wk=dl&dt=2

获得的header信息里文件名是乱码(无法用utf8decode等方法解码),

换用其他组件,header里的文件名是正常的utf8编码,可以解码。

请教,这是怎么回事,有解决方法吗?

乱码信息见图片:
此帖子包含附件:
PNG 图像
大小:5.1K
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/23 16:13:21
1楼: 坐等解惑,这个乱码有人看懂是怎么造成的吗?
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/23 16:20:26
2楼: 本来想给你看看,顺便研究一下的,可以加先登录才能进行下载操作,太花时间了。你应该先把登录的测试链接,含能够登录的参数发上来吧。我这个自己小工具就是用ICS8+XE5写的。
此帖子包含附件:
PNG 图像
大小:131.4K
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/23 16:22:40
3楼: 提示 出错啦!-百度文库 应该是要登录吧?
此帖子包含附件:
PNG 图像
大小:140.8K
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 9:18:59
4楼: 这个帐号可以测试
帐号:gzwckdqqz
密码:zonmkymov

有一些文件是不需要下载点的,例如我贴出来的那个。

使用登录cookies就可以访问了。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 10:41:26
5楼: 直接贴登录可用Cookies吧,不然还是要去分析登录过程,不是一般的烦
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 14:04:05
6楼: cooKies:

BDUT=knqnC89410ACBC4909AFCDB8E3A2F4A1D9F71390a3b6b511; SSUDB=Z-ZnVXRzFUSk55dmhqcjF2ekVkbHJuVTR-by1VZ2lTWkJ0MnpxN09lQ1Y5SGhSQVFBQUFBJCQAAAAAAAAAAEAAADS1LQxvsXO5bjnZmx5AAAAAAAAAAJVnUVGVZ1FRcG; BDUSS=nMtemJwOHBhSn41N3M4ZXJ4NjZ5bzNVQzdac1dqNGY2R0tJRWlhTnFpM2FYa05UQVFBQUFBJCQAAAAAAAAAAEAAABfIm9Bem9vbG9vbG9vAAAAAAAAAANrRG1Pa0RtTQ; BAIDUID=FD3E2211B307838BC1137B64F7AF7E49:FG=1; MCITY=-%3A; BAIDU_WISE_UID=8BA0D668FD34ECB251B77593F4193E02; H_PS_PSSID=5222_1462_5225_6996_7237_7056_7233_6018_7159_7202_7133_7050_6820_7105; Hm_lpvt_=1403257748; Hm_lvt_=1403257748; BAIDU_WAP_WENKU=6d40cd671ed9ad51f01df27d_1_1_1000_2_1_1_color_wk


useragent:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 14:04:46
7楼: 文件地址

 http://wapwenku.baidu.com/download/10baca3343323968011c924b?ssid=&from=&bd_page_type=1&uid=8BA0D668FD34ECB251B77593F4193E02&pu=rc@1,pic@on,sl@1,pw@1000,sz@1509_320,pd@1,fz@2,lp@1,tpl@color,&st=1&wk=dl&dt=2
----------------------------------------------
-
作者:
男 php5 (mvme) ★☆☆☆☆ -
普通会员
2014/6/24 16:00:58
8楼: 2楼用的什么工具?
----------------------------------------------
==========我的网盘http://wefans.jd-app.com==========遇到无法显示的时候在无法显示的页面多刷新几次不是重新点帖子里的地址。。。
作者:
男 php5 (mvme) ★☆☆☆☆ -
普通会员
2014/6/24 16:04:19
9楼: 求2楼共享工具  谢谢 最好带源码
----------------------------------------------
==========我的网盘http://wefans.jd-app.com==========遇到无法显示的时候在无法显示的页面多刷新几次不是重新点帖子里的地址。。。
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 17:26:10
8楼: 初步测试确实存在这个问题,晚上回家再细细研究 。
此帖子包含附件:
PNG 图像
大小:174.7K
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 20:58:26
10楼: 问题应该出在:
unit OverbyteIcsHttpProt;
.......
    if Length(FLastResponse) > 0 then          // FP 09/09/06
          MoveTBytesToString(FReceiveBuffer, 0,
          FLastResponse, 1, Length(FLastResponse)); // FP 09/09/06
对中文处理有问题,一个中文强拆成两个ascii字符又补位成unicode char
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ If UNICODE is defined each byte in Buffer must be ASCII (ord < 128) ! }
procedure MoveTBytesToString(
    const Buffer : TBytes;
    OffsetFrom   : Integer;
    var Dest     : String;
    OffsetTo     : Integer;
    Count        : Integer);
{$IFDEF UNICODE}
var
    PSrc  : PByte;
    PDest : PChar;
begin
    PSrc  := Pointer(Buffer);
    PDest := Pointer(Dest);
    Dec(OffsetTo); // String index!
    while Count > 0 do begin
        PDest[OffsetTo] := Char(PSrc[OffsetFrom]);
        Inc(OffsetTo);
        Inc(OffsetFrom);
        Dec(Count);
    end;
{$ELSE}

好像它假设了头部都是Ascii的字符
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 21:14:50
11楼: 今天时间有限,而且本人水平也有限,稍改了一下,出来了点正确的字符,但出现了新的问题,而且直接在OverbyteIcsHttpProt改不好,最好是在外面打补丁。有时间再研究,希望有高手跟进研究。
此帖子包含附件:
PNG 图像
大小:106.3K
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 21:19:52
12楼: to php5,这个小工具用到的中间库是写给单位,不方便对外公开,而且撇开中间库,这个工具又只剩下壳了。没什么意思,如果你不介意的话,我把小工具放在附件了,只能随便看看了,用的中间库没法提供给你了。抱歉
此帖子包含附件:crystalmoon_2014624211951.rar 大小:127.4K
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/24 22:45:27
13楼: 刚洗完澡,想了一下,还是补完整个版本吧(只对UTF-8来说)。变通一下就自己去想了。效率什么的,偶不在行。。。有高手改进一下吧。

这样子改:
改3292行的:
          if Length(FLastResponse) > 0 then          // FP 09/09/06
          FLastResponse:=TBytesToCPStr(StripByteArray(FReceiveBuffer,0,Length(FLastResponse)),'UTF-8');
//          MoveTBytesToString(FReceiveBuffer, 0,
//          FLastResponse, 1, Length(FLastResponse)); // FP 09/09/06
        end;          // FP 09/09/06


其中 StripByteArray 和 TBytesToCPStr 的函数分别如下,加入就可以了

function StripByteArray(const B: TBytes; Start, Len: Integer):
  TBytes;
var
  First, Last: TBytes;
  I: Integer;
begin
  if Start < 0 then
    Start := 0;
  if Len < 0 then
    Len := 0
  else if Start >= Length(B) then
    Len := 0
  else if Start + Len > Length(B) then
    Len := Length(B) - Start;
  SetLength(Result, Len);
  for I := Start to Start + Len do
  begin
    Result[I - Start] := B[I];
  end;
end;

function TBytesToCPStr(const mBytes: TBytes; CodePage: Integer)
  : string; overload;
var
  TmpEncoding: TEncoding;
begin
  TmpEncoding := TEncoding.GetEncoding(CodePage);
  Result := TmpEncoding.GetString(mBytes);
  TmpEncoding.Free;
end;
这样就OK了,
此帖子包含附件:
PNG 图像
大小:134.1K
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/25 9:10:45
14楼: 谢谢crystalmoon 找到原因。

不过我想在组件里直接将字符流处理为utf-8不妥当,还是需要在程序里自行处理。

或许可以让MoveTBytesToString的结果保持ascii,我稍后试试
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/25 9:31:25
15楼: 昨天写的只是一个思路,我现在是在我自己的继承类,通过覆盖SocketDataAvailabe进行,并增加了HeaderCharset 字符串类型 属性(比如 UTF8,GB2312之类),然后,如果该属性不对空,则按上面的做,否则,直接按原来的处理,以提高效率。。。如果直接改MoveTBytesToString,还是要动那个单元的,这是不可控的。
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/25 10:03:48
15楼: 问题解决了,将函数如下修改

procedure MoveTBytesToString(
    const Buffer : TBytes;
    OffsetFrom   : Integer;
    var Dest     : String;
    OffsetTo     : Integer;
    Count        : Integer);
var
  dstr:string;
begin
  dstr:=TEncoding.Default.GetString(Buffer, OffsetFrom, Count);
  dest:=copy(dest,1,OffsetTo-1)+dstr;
end;

没有优化,不过解决问题了。
我查了一下,这个函数只在这里用了一次,用TEncoding.Default.GetString也是符合XE5的写法,stringof就是这样处理的
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/25 10:20:45
16楼: OK ^_^
----------------------------------------------
-
作者:
男 php5 (mvme) ★☆☆☆☆ -
普通会员
2014/6/25 14:05:05
17楼: 谢谢 crystalmoon 不过附件的压缩包无法解压。。。望重新传 下
----------------------------------------------
==========我的网盘http://wefans.jd-app.com==========遇到无法显示的时候在无法显示的页面多刷新几次不是重新点帖子里的地址。。。
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/25 14:29:50
18楼: winrar 5
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/26 18:52:15
19楼: 前面的解决方法不妥,这个MoveTBytesToString函数不做修改

对header信息用 iso-8859-1 解码即可解决。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/26 19:52:20
20楼: iso-8859-1  不是 latin集的啊,对中文能显示?
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2014/6/26 23:52:37
21楼: iso-8859-1 转 UTF8

      Astr:=tencoding.GetEncoding(65001).getstring(tencoding.GetEncoding(28591).getbytes(headinfo));
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/6/27 8:48:21
22楼: 确实如此,测试通过。
----------------------------------------------
-
作者:
男 lwsxln (lwsxln) ▲▲▲▲▲ -
普通会员
2014/8/12 11:12:22
23楼: to badwood 

这什么原理?iso-8859-1能解析出来?
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/8/13 16:12:01
24楼: OverbyteIcsHttpProt 的修改记录注释里有讲,header信息默认直接按iso-8859-1解析。所以对乱码,先按iso-8859-1方式转入,再转成其它代码,而百度的header是UTf-8的,所以就转成UTF8,上面badwood的代码就是实现了这么一个转换功能。
建议可以看这几篇文章:
http://shadowlin.iteye.com/blog/706744
http://stackoverflow.com/questions/4600545/trouble-with-http-header-specifying-character-encoding-iso-8859-1-rather-than-ut
https://www.activecollab.com/forums/topic/666/
http://www.w3.org/International/O-HTTP-charset

特别是最后一篇:
It is very important to always label Web documents explicitly. HTTP 1.1 says that the default charset is ISO-8859-1. But there are too many unlabeled documents in other encodings, so browsers use the reader's preferred encoding when there is no explicit charset parameter.
----------------------------------------------
-
作者:
男 cnlife (life) ★☆☆☆☆ -
普通会员
2014/8/21 22:09:59
25楼: 楼主,如何访问 https协议的网站??能不能给点相关代码???谢谢。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行149.9023毫秒 RSS