Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE7-将备忘录转换为UTF8_Delphi_Delphi Xe7 - Fatal编程技术网

Delphi XE7-将备忘录转换为UTF8

Delphi XE7-将备忘录转换为UTF8,delphi,delphi-xe7,Delphi,Delphi Xe7,如何将memo.text转换为UTF-8并通过TIdMessage组件发送到电子邮件?我使用了这个功能,但它不能正常工作 函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString; 变量 UTF8Str:UTF8String; i:整数; 开始 UTF8Str:=UTF8String(unicodest); SetLength(结果,长度(UTF8Str)); 对于i:=1到长度(UTF8Str)do 结果[i]:=AnsiChar(Ord(UTF8

如何将memo.text转换为UTF-8并通过TIdMessage组件发送到电子邮件?我使用了这个功能,但它不能正常工作

函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString;
变量
UTF8Str:UTF8String;
i:整数;
开始
UTF8Str:=UTF8String(unicodest);
SetLength(结果,长度(UTF8Str));
对于i:=1到长度(UTF8Str)do
结果[i]:=AnsiChar(Ord(UTF8Str[i]);
结束;

您的功能是不让RTL知道
应答是UTF-8编码的。因此,当函数退出后,
AnsiString
分配给其他字符串时,可能会发生数据丢失

如果您绝对需要返回UTF-8编码的
AnsiString
(我不建议这样做),那么您必须确保其元数据状态字符正在使用UTF-8,例如:

函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString;
变量
UTF8Str:UTF8String;
开始
UTF8Str:=UTF8String(unicodest);
设置字符串(结果、平移(UTF8Str)、长度(UTF8Str));
SetCodePage(PRawByteString(@Result)^,CP_UTF8,False);
结束;
或者:

函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString;
开始
PUTF8String(@Result)^:=unicodest;
结束;
但是,只返回一个
UTF8String
,让RTL为您处理UTF-8会简单得多,例如:

函数TForm1.EncodeAsUTF8(unicodest:string):UTF8String;
开始
结果:=UNICODEST;
结束;
或者,至少返回一个UTF-8编码的
RawByteString
,例如:

函数TForm1.EncodeAsUTF8(unicodest:string):RawByteString;
开始
结果:=UTF8String(unicodest);
结束;

更新:也就是说,
TIdMessage
是Indy组件,Indy使用正常的
字符串
值进行操作。在Delphi(和FPC)的Unicode版本中,Indy将在准备发送电子邮件时为您处理UTF-8编码。只需将
TIdMessage.Body
设置为保存备忘录的常规Unicode文本,并将
TIdMessage.CharSet
设置为
'utf-8'
,例如:

MailMessage.Body:=Memo.line;
//或:MailMessage.Body.Text:=Memo.Text;
MailMessage.CharSet:=“utf-8”;
这就是你所需要的。您根本不需要手动将备忘录文本编码为UTF-8

只有在非Unicode版本的Delphi(和FPC)中使用
EncodeAsUTF8()
函数才有意义。仍然需要设置
TIdMessage.CharSet
属性,以便电子邮件头声明UTF-8,但Indy将按原样发送
AnsiString
字节,而不会对其重新编码,因此您将负责确保
AnsiString
使用UTF-8,例如:

函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString;
开始
结果:=UTF8Encode(UNICODEST);
结束;
...
MailMessage.Body.Text:=EncodeAsUTF8(Memo.Text);
MailMessage.CharSet:=“utf-8”;

您的功能是不让RTL知道
应答是UTF-8编码的。因此,当函数退出后,
AnsiString
分配给其他字符串时,可能会发生数据丢失

如果您绝对需要返回UTF-8编码的
AnsiString
(我不建议这样做),那么您必须确保其元数据状态字符正在使用UTF-8,例如:

函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString;
变量
UTF8Str:UTF8String;
开始
UTF8Str:=UTF8String(unicodest);
设置字符串(结果、平移(UTF8Str)、长度(UTF8Str));
SetCodePage(PRawByteString(@Result)^,CP_UTF8,False);
结束;
或者:

函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString;
开始
PUTF8String(@Result)^:=unicodest;
结束;
但是,只返回一个
UTF8String
,让RTL为您处理UTF-8会简单得多,例如:

函数TForm1.EncodeAsUTF8(unicodest:string):UTF8String;
开始
结果:=UNICODEST;
结束;
或者,至少返回一个UTF-8编码的
RawByteString
,例如:

函数TForm1.EncodeAsUTF8(unicodest:string):RawByteString;
开始
结果:=UTF8String(unicodest);
结束;

更新:也就是说,
TIdMessage
是Indy组件,Indy使用正常的
字符串
值进行操作。在Delphi(和FPC)的Unicode版本中,Indy将在准备发送电子邮件时为您处理UTF-8编码。只需将
TIdMessage.Body
设置为保存备忘录的常规Unicode文本,并将
TIdMessage.CharSet
设置为
'utf-8'
,例如:

MailMessage.Body:=Memo.line;
//或:MailMessage.Body.Text:=Memo.Text;
MailMessage.CharSet:=“utf-8”;
这就是你所需要的。您根本不需要手动将备忘录文本编码为UTF-8

只有在非Unicode版本的Delphi(和FPC)中使用
EncodeAsUTF8()
函数才有意义。仍然需要设置
TIdMessage.CharSet
属性,以便电子邮件头声明UTF-8,但Indy将按原样发送
AnsiString
字节,而不会对其重新编码,因此您将负责确保
AnsiString
使用UTF-8,例如:

函数TForm1.EncodeAsUTF8(UnicodeStr:string):AnsiString;
开始
结果:=UTF8Encode(UNICODEST);
结束;
...
MailMessage.Body.Text:=EncodeAsUTF8(Memo.Text);
MailMessage.CharSet:=“utf-8”;

使用
TEncoding.UTF8.GetBytes()
。您没有将UTF8存储在
ansisting
中。非常感谢您的回复,但它仍然不起作用。我有一个memo字段,其中一个值是“Kontož”,当我将该字符串发送到电子邮件时,我将其作为“Konto???”。@Pekkala这部分是因为RTL不知道您的
AnsiString
是UTF-8编码的,所以在分配给