我正在使用Delphi 7和ICS组件与php脚本进行通信并在mysql数据库中插入一些数据…
如何使用http post发布unicode数据?
从tnt控件使用utf8encode之后,我正在将其发布到PHP脚本
echo "Note = ". $_POST['note'];
if($_POST['action'] == 'i')
{
/*
* This code will add new notes to the database
*/
$sql = "INSERT INTO app_notes VALUES ('', '" . mysql_real_escape_string($_POST['username']) . "', '" . mysql_real_escape_string($_POST['note']) . "', NOW(), '')";
$result = mysql_query($sql, $link) or die('0 - Ins');
echo '1 - ' . mysql_insert_id($link);
?>
德尔福代码:
data := Format('date=%s&username=%s&password=%s&hash=%s¬e=%s&action=%s',
[UrlEncode(FormatDateTime('yyyymmddhh:nn',now)),
UrlEncode(edtUserName.Text),
UrlEncode(getMd51(edtPassword.Text)),
UrlEncode(getMd51(dataHash)),UrlEncode(Utf8Encode(memoNote.Text)),'i'
]);
// try function StrHtmlEncode (const AStr: String): String; from IdStrings
HttpCli1.SendStream := TMemoryStream.Create;
HttpCli1.SendStream.Write(Data[1], Length(Data));
HttpCli1.SendStream.Seek(0, 0);
HttpCli1.RcvdStream := TMemoryStream.Create;
HttpCli1.URL := Trim(ActionURLEdit.Text);
HttpCli1.PostAsync;
但是当我发布时,unicode值与Tnt Memo中看到的原始值完全不同
有什么我想念的吗?!
也有人知道如何用Indy做到这一点?
谢谢.
解决方法:
您的示例代码显示来自TNT Unicode控件的数据.该值将具有类型WideString,因此要获取UTF-8数据,您应该调用Utf8Encode,它将返回AnsiString值.然后在该值上调用UrlEncode.确保UrlEncode的输入类型是AnsiString.所以,像这样:
var
data, date, username, passhash, datahash, note: AnsiString;
date := FormatDateTime('yyyymmddhh:nn',now);
username := Utf8Encode(edtUserName.Text);
passhash := getMd51(edtPassword.Text);
datahash := getMd51(data);
note := Utf8Encode(memoNote.Text);
data := Format('date=%s&username=%s&password=%s&hash=%s¬e=%s&action=%s',
[UrlEncode(date),
UrlEncode(username),
UrlEncode(passhash),
UrlEncode(datahash),
UrlEncode(note),
'i'
]);
由于MD5字符串值只是十六进制字符,因此不需要对MD5值进行UTF-8编码.但是,您应该仔细检查您的getMd51函数是否接受WideString.否则,您可能会在将数据发送到任何地方之前丢失数据.
接下来,您遇到了在PHP中接收UTF-8数据的问题.我希望你在那里或在MySQL中没有什么特别的.无论你存储什么,你都应该稍后回来.将其发送回您的Delphi程序,并将UTF-8数据解码回WideString.
换句话说,您的Unicode数据在数据库中看起来会有所不同,因为您将其存储为UTF-8.在您的数据库中,您看到的是UTF-8编码的数据,但是在您的TNT控件中,您会看到常规的Unicode字符.
因此,例如,如果您在编辑框中键入字符“ش”,那就是Unicode字符U 0634,阿拉伯字母光泽.作为UTF-8,这是两字节序列0xD8 0xB4.如果将这些字节存储在数据库中,然后查看该字段的原始内容,您可能会看到字符被解释为这些字节是在某些ANSI编码中.对这些字节的一种可能的解释是两个字符的序列“Ø”,这是拉丁语大写字母o,其中有一个笔画,后面是一个尖锐的重音.
当您将该字符串加载回数据库时,它仍然被编码为UTF-8,就像您存储它时一样,因此您需要对其进行解码.据我所知,PHP和MySQL都不会对您的数据进行任何按摩,因此您提供的任何UTF-8字符都将按原样返回给您.如果您正在使用Delphi中的数据,则调用Utf8Decode,它是您之前调用的Utf8Encode函数的补充.如果您正在使用PHP中的数据,那么您可能对PHP的utf8_decode函数感兴趣,尽管它转换为ISO-8859-1,它不包括我们的示例阿拉伯字符. Stack Overflow已经有一些与在PHP中使用UTF-8相关的问题,所以我不会尝试在这里添加它们.例如:
标签:php,unicode,delphi
来源: https://codeday.me/bug/20191007/1867258.html