gpt4 book ai didi

php - 如何在 Utf-8 -> php 脚本 -> mysql 中执行 HTTP POST

转载 作者:行者123 更新时间:2023-12-03 00:12:18 24 4
gpt4 key购买 nike

我正在使用Delphi 7和ICS组件与php脚本通信并在mysql数据库中插入一些数据...

如何使用 http post 发布 unicode 数据?

使用 tnt 控件中的 utf8encode 后,我将其发布到 PHP 脚本

<?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 值进行 UTF-8 编码,因为 MD5 字符串值只是十六进制字符。但是,您应该仔细检查您的 getMd51 函数是否接受 WideString。否则,您可能在将数据发送到任何地方之前就丢失了数据。

接下来,您会遇到在 PHP 中接收 UTF-8 数据的问题。我希望您在那里或在 MySQL 中不需要做任何特别的事情。无论您存储什么,您都应该稍后以相同的方式返回。将其发送回您的 Delphi 程序,并将 UTF-8 数据解码回 WideString

换句话说,您的 Unicode 数据在数据库中看起来会有所不同,因为您将其存储为 UTF-8。在数据库中,您看到的是 UTF-8 编码的数据,但在 TNT 控件中,您看到的是常规 Unicode 字符。

例如,如果您在编辑框中键入字符“Í”,则该字符是 Unicode 字符 U+0634,阿拉伯字母 sheen。作为 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 - 如何在 Utf-8 -> php 脚本 -> mysql 中执行 HTTP POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/305265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com