php发送post请求头utf-8,如何在Utf-8中执行HTTP POST – > php脚本 – > mysql

我正在使用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&note=%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&note=%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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值