Как выполнить HTTP POST в Utf-8 -> php script -> mysql

Я использую компоненты 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; 

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

Есть что-то, чего я не вижу?

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

Благодарю.

В вашем примере кода отображаются данные, поступающие от элемента управления TNT Unicode. Это значение будет иметь тип WideString , поэтому для получения данных UTF-8 вы должны вызвать Utf8Encode , который вернет значение AnsiString . Затем вызовите UrlEncode на это значение. Убедитесь, что UrlEncode ввода UrlEncodeAnsiString . Итак, что-то вроде этого:

 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 принимает getMd51 . В противном случае вы можете потерять данные, прежде чем отправлять их в любом месте.

Затем у вас возникла проблема получения данных UTF-8 в PHP. Я ожидаю, что вам ничего особенного не нужно делать или в MySQL. Независимо от того, что вы храните, вы должны вернуться к тому же позже. Отправьте это обратно в свою программу Delphi и преобразуйте данные UTF-8 обратно в WideString .

Другими словами, ваши данные Unicode будут выглядеть по-разному в вашей базе данных, потому что вы храните их как UTF-8. В вашей базе данных вы видите данные с кодировкой UTF-8, но в ваших элементах управления TNT вы видите обычные символы Unicode.

Так, например, если вы введете символ «ش» в поле редактирования, это символ Юникода U + 0634, арабский буквенный символ. Как UTF-8, это двухбайтная последовательность 0xD8 0xB4. Если вы храните эти байты в своей базе данных и просматриваете необработанное содержимое поля, вы можете увидеть символы, интерпретируемые так, как если бы эти байты были в некоторой кодировке ANSI. Одна возможная интерпретация этих байтов – это двухсимвольная последовательность «Ø», которая является латинской заглавной буквой o с инсультом, сопровождаемой острым акцентом.

Когда вы загружаете эту строку из своей базы данных, она по-прежнему кодируется как UTF-8, так же, как и при ее сохранении, поэтому вам нужно ее декодировать. Насколько я могу судить, ни PHP, ни MySQL не массируют ваши данные, поэтому любой символ UTF-8, который вы им дадите, будет возвращен вам как есть. Если вы используете данные в Delphi, тогда вызовите Utf8Decode , который является дополнением к функции Utf8Encode которую вы вызывали ранее. Если вы используете данные в PHP, вам может быть интересна функция utf8_decode PHP, хотя она преобразуется в ISO-8859-1, которая не включает наш пример арабского символа. В Stack Overflow уже есть несколько вопросов, связанных с использованием UTF-8 в PHP, поэтому я не буду пытаться добавлять их сюда. Например:

  • Лучшие практики в PHP и MySQL с международными строками
  • UTF-8 на всем пути …

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

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