编码在印第安纳波利斯10和Delphi(Encoding in Indy 10 and Delphi

2019-10-20 14:30发布

我使用的印第10德尔福。 以下是我的代码,它使用EncodeString印的方法来编码字符串。

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

我没有收到在编码蜇正确的值。

Answer 1:

什么是目的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_ACP一个莫如ÇP的年龄 ,当前操作系统Windows ANSI代码页。 因此,在Windows至少, IndyTextEncoding_OSDefault是当前操作系统Windows ANSI代码页的编码。


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

这是因为的Delphi 7 /印9代码TEncoderMIME.EncodeString不执行任何代码页转换和MIME编码输入的字符串,就像它是一个字节数组。 由于德尔福7串在活动ANSI代码页编码,这有作为传递同样的效果IndyTextEncoding_OSDefaultTEncoderMIME.EncodeString代码的您Unicode版本。


是什么区别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



文章来源: Encoding in Indy 10 and Delphi