Как сделать HTTP POST в Utf-8 -> PHP-скрипт -> MySQL - PullRequest
1 голос
/ 20 ноября 2008

Я использую компоненты Delphi 7 и ICS для связи со сценарием php и вставки некоторых данных в базу данных mysql ...

Как опубликовать данные в юникоде с помощью http post?

После использования utf8encode из элементов управления tnt я делаю это для отправки в скрипт 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);
?>

Delphi код:

  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;

Но когда я публикую это значение Юникода, оно будет совершенно другим, чем оригинальное, которое я вижу в Tnt Memo

Что-то я упускаю?!

Также кто-нибудь знает, как это сделать с Инди?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 21 ноября 2008

Ваш пример кода показывает ваши данные, поступающие с элемента управления 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'
               ]);

Не должно быть необходимости кодировать UTF-8 значений MD5, поскольку строковые значения MD5 - это просто шестнадцатеричные символы. Однако вам следует дважды проверить, что ваша getMd51 функция принимает WideString. В противном случае вы можете потерять данные, прежде чем отправлять их куда-либо.

Далее у вас проблема с получением данных UTF-8 в PHP. Я ожидаю, что нет ничего особенного, что вам нужно делать там или в 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 уже есть несколько вопросов, связанных с использованием UTF-8 в PHP, поэтому я не буду пытаться добавить их сюда. Например:

2 голосов
/ 20 ноября 2008

Кодировать данные UTF-8 в application / x-www-form-urlencoded. Это гарантирует, что сервер может читать данные через соединение http

0 голосов
/ 20 ноября 2008

Я ожидаю (не зная наверняка), что вам придется выводить их как & # nnnnn сущности (с числом в десятичном, а не шестнадцатеричном ... я думаю)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...