Ваш пример кода показывает ваши данные, поступающие с элемента управления 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¬e=%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, поэтому я не буду пытаться добавить их сюда. Например: