首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Utf-8 -> php script -> mysql中执行HTTP POST

如何在Utf-8 -> php script -> mysql中执行HTTP POST
EN

Stack Overflow用户
提问于 2008-11-20 13:19:28
回答 3查看 8.9K关注 0票数 1

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

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

之后使用utf8encode从tnt控制,我正在做它的post到PHP脚本

代码语言:javascript
复制
<?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);
?>

Delphi代码:

代码语言:javascript
复制
  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备忘录中看到的原始值完全不同时

我是不是漏掉了什么?!

还有人知道如何用Indy做到这一点吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-20 21:37:55

示例代码显示了来自TNT Unicode控件的数据。该值的类型为WideString,因此要获取UTF8数据,您应该调用Utf8Encode,它将返回一个AnsiString值。然后对该值调用UrlEncode。确保UrlEncode的输入类型是AnsiString

代码语言:javascript
复制
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值进行UTF8编码。但是,您应该仔细检查您的getMd51函数是否接受WideString。否则,在将数据发送到任何地方之前,您可能会丢失数据。

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

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

例如,如果你在编辑框中输入“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相关的问题,所以我不打算在这里添加这些问题。例如:

票数 3
EN

Stack Overflow用户

发布于 2008-11-20 13:23:27

将UTF-8数据编码到application/x-www-form-urlencoded中。这将确保服务器可以通过http连接读取数据。

票数 2
EN

Stack Overflow用户

发布于 2008-11-20 13:22:23

我希望(不确定地)您必须将它们输出为&#nnnnn实体(使用十进制而不是十六进制的数字……我想)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/305265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档