我正在使用Indy 10和Delphi。以下是我的代码,它使用Indy的EncodeString
方法对字符串进行编码。
var
EncodedString : String;
StringToBeEncoded : String;
EncoderMIME: TIdEncoderMIME;
....
....
EncodedString := EncoderMIME.EncodeString(StringToBeEncoded);
我没有在编码刺痛中得到正确的值。
答案 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_ACP
是Active 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_Default
和IndyTextEncoding_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
的值确定的编码。默认情况下,GIdDefaultTextEncoding
为encASCII
。因此,默认情况下,IndyTextEncoding_Default
会产生ASCII编码。
除此之外,你应该问自己想要使用哪种编码。依赖默认值会使您受到这些默认值的支配。如果这些默认值不能做你想做的事情怎么办?特别是因为默认值不是Unicode编码,因此仅支持有限范围的字符。还有什么更依赖于系统设置。
如果您希望对国际文本进行编码,通常会选择使用UTF-8编码。
要做的另一点是,您正在调用EncodeString
,就好像它是一个实例方法,但它实际上是一个类方法。您可以删除EncoderMIME
并致电TEncoderMIME.EncodeString
。或者保持EncoderMIME
并致电EncoderMIME.Encode
。