我使用的印第10德尔福。 以下是我的代码,它使用EncodeString
印的方法来编码字符串。
var
EncodedString : String;
StringToBeEncoded : String;
EncoderMIME: TIdEncoderMIME;
....
....
EncodedString := EncoderMIME.EncodeString(StringToBeEncoded);
我没有收到在编码蜇正确的值。
我使用的印第10德尔福。 以下是我的代码,它使用EncodeString
印的方法来编码字符串。
var
EncodedString : String;
StringToBeEncoded : String;
EncoderMIME: TIdEncoderMIME;
....
....
EncodedString := EncoderMIME.EncodeString(StringToBeEncoded);
我没有收到在编码蜇正确的值。
什么是目的
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_OSDefault
到TEncoderMIME.EncodeString
代码的您Unicode版本。
是什么区别
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
。