使用indy.IdPOP3和IdMessage接收文件时,为何不能对中文进行解码?例如 Subject [=?GB2312?B?1tDOxLXEU3ViamVjdA==?=]好像是不能对mime进行解码请网友推荐几本讲解indy的书
解决方案 »
- TcxRadioGroup 的用法
- 求教如何去除IdHttp里的端口号
- 为什么我在我的机子上编译的EXE文件在有些机子上不能运行
- delphi filter 筛选是否受硬件的影响导致不同的结果?
- 给各位拜年了,请问在delphi中如何调用sql server2000数据库(mymis)中的表(mytabl)?
- 在query里些sql语句怎样加通配符(初学编程,见笑,见笑!)
- 如何实现浮动工具兰
- 再问一个狂菜的问题,不要笑啊!:)
- 一个简单的问题,拿分吧
- 我做了一个数据库单表或多表的查询组件包很好用。请大家多提意见
- 数据库控件在哪里...
- dbgrid控件作为一个access数据表的数据录入窗口,能不能用回车键代替TAB键。
下面应该是你要的function CheckTxt(s: string): string;
var
s1, s2, s3: integer;
t, v: string;
Encoding: char;
hex, step: integer;
a1: array[1..4] of byte;
b1: array[1..3] of byte;
j: integer;
byte_ptr, real_bytes: integer;
begin
s1 := Pos('=?', s);
s2 := 1;
hex := 0;
if s1 > 0 then
begin
for s2 := Length(s) - 1 downto 1 do
begin
if Copy(s, s2, 2) = '?=' then Break;
end;
end;
if (s1 = 0) or (s2 = 1) then
begin
Result := s;
Exit;
end;
t := Copy(s, s1 + 2, s2 - 2 - s1);
s3 := Pos('?', t);
Delete(t, 1, s3);
if (t = '') then
begin
Result := s;
Exit;
end;
Encoding := t[1];
Delete(t, 1, 2);
v := '';
step := 0;
case Encoding of
'Q':
while t <> '' do
begin
case step of
0:
begin
case t[1] of
'_': v := v + ' ';
'=': step := 1;
else
v := v + t[1];
end;
end;
1:
begin
if t[1] <= '9' then
hex := (Ord(t[1]) - Ord('0')) * 16
else
hex := (Ord(t[1]) - 55) * 16;
step := 2;
end;
2:
begin
if t[1] <= '9' then
hex := hex + (Ord(t[1]) - Ord('0'))
else
hex := hex + Ord(t[1]) - 55;
v := v + Chr(hex);
step := 0;
end;
end;
Delete(t, 1, 1);
end;
'B':
begin
byte_ptr := 0;
for j := 1 to Length(t) do
begin
Inc(byte_ptr);
case t[j] of
'A'..'Z': a1[byte_ptr] := Ord(t[j]) - 65;
'a'..'z': a1[byte_ptr] := Ord(t[j]) - 71;
'0'..'9': a1[byte_ptr] := Ord(t[j]) + 4;
'+': a1[byte_ptr] := 62;
'/': a1[byte_ptr] := 63;
'=': a1[byte_ptr] := 64;
end;
if byte_ptr = 4 then
begin
byte_ptr := 0;
real_bytes := 3;
if a1[1] = 64 then real_bytes := 0;
if a1[3] = 64 then
begin
a1[3] := 0;
a1[4] := 0;
real_bytes := 1;
end;
if a1[4] = 64 then
begin
a1[4] := 0;
real_bytes := 2;
end;
b1[1] := a1[1] * 4 + (a1[2] div 16);
b1[2] := (a1[2] mod 16) * 16 + (a1[3] div 4);
b1[3] := (a1[3] mod 4) * 64 + a1[4];
if (real_bytes > 0) then
v := v + chr(b1[1]);
if (real_bytes > 1) then
v := v + chr(b1[2]);
if (real_bytes > 2) then
v := v + chr(b1[3]);
end;
end;
end;
end;
Result := Copy(s, 1, s1 - 1) + v + Copy(s, s2 + 2, 999);
end;