导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2014/6/20 19:12:35
标题:
有人用ICS 8吗?遇到关于文件名乱码的难题了
浏览:2614
加入我的收藏
楼主:
我用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编码,可以解码。 请教,这是怎么回事,有解决方法吗? 乱码信息见图片:
此帖子包含附件: 大小: 5.1K
----------------------------------------------
-
作者:
2014/6/23 16:13:21
1楼:
坐等解惑,这个乱码有人看懂是怎么造成的吗?
----------------------------------------------
-
作者:
2014/6/23 16:20:26
2楼:
本来想给你看看,顺便研究一下的,可以加先登录才能进行下载操作,太花时间了。你应该先把登录的测试链接,含能够登录的参数发上来吧。我这个自己小工具就是用ICS8+XE5写的。
此帖子包含附件: 大小: 131.4K
----------------------------------------------
-
作者:
2014/6/23 16:22:40
3楼:
提示 出错啦!-百度文库 应该是要登录吧?
此帖子包含附件: 大小: 140.8K
----------------------------------------------
-
作者:
2014/6/24 9:18:59
4楼:
这个帐号可以测试 帐号:gzwckdqqz 密码:zonmkymov 有一些文件是不需要下载点的,例如我贴出来的那个。 使用登录cookies就可以访问了。
----------------------------------------------
-
作者:
2014/6/24 10:41:26
5楼:
直接贴登录可用Cookies吧,不然还是要去分析登录过程,不是一般的烦
----------------------------------------------
-
作者:
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
----------------------------------------------
-
作者:
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==========遇到无法显示的时候在无法显示的页面多刷新几次不是重新点帖子里的地址。。。
作者:
2014/6/24 17:26:10
8楼:
初步测试确实存在这个问题,晚上回家再细细研究 。
此帖子包含附件: 大小: 174.7K
----------------------------------------------
-
作者:
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的字符
----------------------------------------------
-
作者:
2014/6/24 21:14:50
11楼:
今天时间有限,而且本人水平也有限,稍改了一下,出来了点正确的字符,但出现了新的问题,而且直接在OverbyteIcsHttpProt改不好,最好是在外面打补丁。有时间再研究,希望有高手跟进研究。
此帖子包含附件: 大小: 106.3K
----------------------------------------------
-
作者:
2014/6/24 21:19:52
12楼:
to php5,这个小工具用到的中间库是写给单位,不方便对外公开,而且撇开中间库,这个工具又只剩下壳了。没什么意思,如果你不介意的话,我把小工具放在附件了,只能随便看看了,用的中间库没法提供给你了。抱歉
----------------------------------------------
-
作者:
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了,
此帖子包含附件: 大小: 134.1K
----------------------------------------------
-
作者:
2014/6/25 9:10:45
14楼:
谢谢crystalmoon 找到原因。 不过我想在组件里直接将字符流处理为utf-8不妥当,还是需要在程序里自行处理。 或许可以让MoveTBytesToString的结果保持ascii,我稍后试试
----------------------------------------------
-
作者:
2014/6/25 9:31:25
15楼:
昨天写的只是一个思路,我现在是在我自己的继承类,通过覆盖SocketDataAvailabe进行,并增加了HeaderCharset 字符串类型 属性(比如 UTF8,GB2312之类),然后,如果该属性不对空,则按上面的做,否则,直接按原来的处理,以提高效率。。。如果直接改MoveTBytesToString,还是要动那个单元的,这是不可控的。
----------------------------------------------
-
作者:
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就是这样处理的
----------------------------------------------
-
作者:
2014/6/25 10:20:45
16楼:
OK ^_^
----------------------------------------------
-
作者:
php5 (mvme)
★☆☆☆☆
-
普通会员
2014/6/25 14:05:05
17楼:
谢谢 crystalmoon 不过附件的压缩包无法解压。。。望重新传 下
----------------------------------------------
==========我的网盘http://wefans.jd-app.com==========遇到无法显示的时候在无法显示的页面多刷新几次不是重新点帖子里的地址。。。
作者:
2014/6/25 14:29:50
18楼:
winrar 5
----------------------------------------------
-
作者:
2014/6/26 18:52:15
19楼:
前面的解决方法不妥,这个MoveTBytesToString函数不做修改 对header信息用 iso-8859-1 解码即可解决。
----------------------------------------------
-
作者:
2014/6/26 19:52:20
20楼:
iso-8859-1 不是 latin集的啊,对中文能显示?
----------------------------------------------
-
作者:
2014/6/26 23:52:37
21楼:
iso-8859-1 转 UTF8 Astr:=tencoding.GetEncoding(65001).getstring(tencoding.GetEncoding(28591).getbytes(headinfo));
----------------------------------------------
-
作者:
2014/6/27 8:48:21
22楼:
确实如此,测试通过。
----------------------------------------------
-
作者:
2014/8/12 11:12:22
23楼:
to badwood 这什么原理?iso-8859-1能解析出来?
----------------------------------------------
-
作者:
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.
----------------------------------------------
-
作者:
2014/8/21 22:09:59
25楼:
楼主,如何访问 https协议的网站??能不能给点相关代码???谢谢。
----------------------------------------------
-