metodo - Cómo hacer HTTP POST en Utf-8-> script php-> mysql
recoger get php (3)
Estoy usando los componentes de Delphi 7 y ICS para comunicarme con el script php e insertar algunos datos en la base de datos mysql ...
Cómo publicar datos Unicode usando http post?
Después de usar utf8encode desde los controles tnt lo estoy haciendo para publicar en script 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);
?>
Código Delphi:
data := Format(''date=%s&username=%s&password=%s&hash=%s¬e=%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;
Pero cuando publico ese valor Unicode es totalmente diferente al original que veo en Tnt Memo
Hay algo que este olvidando ?!
¿Alguien sabe cómo hacer esto con Indy?
Gracias.
Codifique los datos UTF-8 en application / x-www-form-urlencoded. Esto asegurará que el servidor pueda leer los datos a través de la conexión http
Esperaría (sin saberlo con certeza) que tendrías que sacarlos como & # nnnnn entidades (con el número en decimal en vez de hexadecimal ... creo)
Su código de ejemplo muestra que sus datos provienen de un control TNT Unicode. Ese valor tendrá tipo WideString
, por lo que para obtener datos UTF-8, debe llamar a Utf8Encode
, que devolverá un valor de AnsiString
. Luego llama a UrlEncode
sobre ese valor. Asegúrese de que el tipo de entrada de AnsiString
sea AnsiString
. Entonces, algo como esto:
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''
]);
No debería haber necesidad de codificar UTF-8 los valores MD5 ya que los valores de cadena MD5 son solo caracteres hexadecimales. Sin embargo, debe verificar que su función WideString
acepte WideString
. De lo contrario, es posible que pierda datos antes de enviarlos a ninguna parte.
A continuación, tiene el problema de recibir datos UTF-8 en PHP. Espero que no haya nada especial que necesite hacer allí o en MySQL. Lo que sea que almacene, debe volver idénticamente más tarde. Envíelo de vuelta a su programa Delphi y decodifique los datos de UTF-8 en una WideString
.
En otras palabras, sus datos Unicode se verán diferentes en su base de datos porque los está almacenando como UTF-8. En su base de datos, está viendo datos codificados en UTF-8, pero en sus controles TNT, está viendo los caracteres Unicode normales.
Entonces, por ejemplo, si escribe el carácter "ش" en su cuadro de edición, ese es el carácter Unicode U + 0634, brillo de letra árabe. Como UTF-8, esa es la secuencia de dos bytes 0xD8 0xB4. Si almacena esos bytes en su base de datos y luego ve el contenido sin procesar del campo, puede ver los caracteres interpretados como si esos bytes estuvieran en alguna codificación ANSI. Una interpretación posible de esos bytes es como la secuencia de dos caracteres "Ø", que es la letra mayúscula latina o con un trazo seguido de un acento agudo.
Cuando vuelve a cargar esa cadena en su base de datos, sigue codificada como UTF-8, tal como estaba cuando la almacenó, por lo que deberá decodificarla. Por lo que puedo decir, ni PHP ni MySQL hacen ningún masaje de tus datos, por lo que cualquier personaje UTF-8 que les des será devuelto tal como está. Si está utilizando los datos en Delphi, llame a Utf8Decode
, que es el complemento de la función Utf8Encode
que llamó anteriormente. Si está utilizando los datos en PHP, entonces podría estar interesado en la función utf8_decode
de PHP, aunque eso se convierte en ISO-8859-1, que no incluye nuestro ejemplo de carácter árabe. ya tiene algunas preguntas relacionadas con el uso de UTF-8 en PHP, por lo que no intentaré agregarlas aquí. Por ejemplo: