在Indy 10和Delphi中编码

时间:2014-07-30 06:56:20

标签: delphi delphi-7 indy delphi-xe4 indy10

我正在使用Indy 10和Delphi。以下是我的代码,它使用Indy的EncodeString方法对字符串进行编码。

var
  EncodedString : String;
  StringToBeEncoded : String;
  EncoderMIME: TIdEncoderMIME;
....
....
EncodedString := EncoderMIME.EncodeString(StringToBeEncoded);

我没有在编码刺痛中得到正确的值。

1 个答案:

答案 0 :(得分:2)

  

IndyTextEncoding_OSDefault的目的是什么?

这是IndyTextEncoding_OSDefault的源代码。

function IndyTextEncoding_OSDefault: IIdTextEncoding;
begin
  if GIdOSDefaultEncoding = nil then begin
    LEncoding := TIdMBCSEncoding.Create;
    if InterlockedCompareExchangeIntf(IInterface(GIdOSDefaultEncoding), LEncoding, nil) <> nil then begin
      LEncoding := nil;
    end;
  end;
  Result := GIdOSDefaultEncoding;
end;

请注意,为简单起见,我删除了.net条件代码。这段代码大部分是为了安排单例线程安全。返回的实际值是通过调用TIdMBCSEncoding.Create合成的。让我们来看看。

constructor TIdMBCSEncoding.Create;
begin
  Create(CP_ACP, 0, 0);
end;

我再次删除了不适用于您的Windows设置的条件代码。现在,CP_ACPActive Code Page,即当前系统的Windows ANSI代码页。因此,至少在Windows上,IndyTextEncoding_OSDefault是当前系统Windows ANSI代码页的编码。


  

为什么使用IndyTextEncoding_OSDefault给出与我的Delphi 7代码相同的行为?

这是因为TEncoderMIME.EncodeString的Delphi 7 / Indy 9代码不执行任何代码页转换,MIME对输入字符串进行编码,就好像它是一个字节数组一样。由于Delphi 7字符串是在活动的ANSI代码页中编码的,因此这与在Unicode版本的代码中将IndyTextEncoding_OSDefault传递给TEncoderMIME.EncodeString具有相同的效果。


  

IndyTextEncoding_DefaultIndyTextEncoding_OSDefault之间的区别是什么?

以下是IndyTextEncoding_OSDefault的源代码:

function IndyTextEncoding_Default: IIdTextEncoding;
var
  LType: IdTextEncodingType;
begin
  LType := GIdDefaultTextEncoding;
  if LType = encIndyDefault then begin
    LType := encASCII;
  end;
  Result := IndyTextEncoding(LType);
end;

这将返回由GIdDefaultTextEncoding的值确定的编码。默认情况下,GIdDefaultTextEncodingencASCII。因此,默认情况下,IndyTextEncoding_Default会产生ASCII编码。


除此之外,你应该问自己想要使用哪种编码。依赖默认值会使您受到这些默认值的支配。如果这些默认值不能做你想做的事情怎么办?特别是因为默认值不是Unicode编码,因此仅支持有限范围的字符。还有什么更依赖于系统设置。

如果您希望对国际文本进行编码,通常会选择使用UTF-8编码。


要做的另一点是,您正在调用EncodeString,就好像它是一个实例方法,但它实际上是一个类方法。您可以删除EncoderMIME并致电TEncoderMIME.EncodeString。或者保持EncoderMIME并致电EncoderMIME.Encode