一、Indy编码
IndyTextEncoding_OSDefault 与 IndyTextEncodint_Default的区别:
IndyTextEncodint_Default := encASCII.
IndyTextEncoding_OSDefault windows环境下采用的ANSI编码
二、
XE7下的 TIdhttp 一般情况下是可以自动根据返回的头文件的编码关键字自动判断使用哪种编码格式来解码
所以一般情况下我们不需要再手动设置编码格式,手动解码,直接按下面代码就可以了:
ptext := idc.get(url);
ptext := idc.post(url)
但是有些response header 中没有charset这个字段
会自动解码失败,就需要手动设置解码。
当出现解码失败的情况,可以用抓包工具抓一下,看看有没有关于编码的信息,如果没有,就试试设置成为
默认的编码格式。
我们系统下默认的格式是ANSI编码。一般情况下是可以解决问题的。
如下:
Stream := Tstreamstring.create('', Tencoding.default);
Idc.get(url,Stream);
Ptext := Stream.datastring;
三、Unicode 和 Ansi
一定要注意delphi7 与 XE7中字符编码方式是完全不同的。
delphi7是Ansi编码的 Sizeof(Char) = 1 。 string 即Ansistring
XE7
是Unicode 编码
的 sizeof(Char)=2. string 即 Widestring
也就是说Xe7下一个字符是占了两个字节。
这之间的编码习惯就一定要注意了,如果函数要求传入 AnsiString,那就不能传入String;
像我们之前在delphi7下使用的验证码识别函数就不能直接搬过来用了,需要更改参数类型。
举个例子:
Str :string;
Str := '
广东省深圳市
';
Copy(Str,4,3);
在delphi7下这样得到的结果一定是乱码的。
此句话的意思是:截取从第四个字符开始,总共截取三个字符。
一个汉字是占两个字符的,如果不是从一个汉字开始字符开始截取,就会出现乱码,这种情况将str 声明为Widestring就可以解决。
所以 在xe7不会存在此问题。一个字符占2个字节, 一定是能够截取到完整的汉字。
四、如果程序中用到了SSL安全加密
之前delphi7下引用的 ssleay32.dll 和 libeay32.dll 与 xe7的不能通用。
XE7的系统库中已经包含这两个文件。当部署程序的时候,一定要将这两个文件拷贝出来一起打包,
并且需要msvcr100.dll这个库文件,应该是用到了.net相关的。
更多变化请看delpih贴吧 http://tieba.baidu.com/p/2625972288