UTF-8 HTTP POST yapmak nasıl ->

3 Cevap php

Php script ile iletişim kurmak ve mysql veritabanında bazı veri eklemek için Delphi 7 ve ICS bileşenleri kullanıyorum ...

Http yazıyı kullanarak unicode veri göndermek nasıl?

Utf8encode tnt denetimlerden kullandıktan sonra ben PHP komut dosyası göndermek için yapıyorum

<?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 kodu:

  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;

Ama unicode değeri sonra Tnt Not bakın orijinal biri tamamen farklı olduğunu sonrası

Ben eksik bir şey var mı?!

Ayrıca herkes Indy ile bunu nasıl bilir?

Teşekkürler.

3 Cevap

Sizin örnek kod, veri TNT Unicode denetimden gelen gösterir. Bu değer bir AnsiString değerini dönecektir ki, Utf8Encode aramak gerekir, bu yüzden UTF-8 veri almak için, tipini WideString sahip olacaktır. Sonra bu değeri UrlEncode diyoruz. Emin olun UrlEncode 's giriş tipidir AnsiString. Yani, böyle bir şey:

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 dize değerleri yalnızca onaltılı karakter olduğundan, MD5 değerleri UTF-8 kodlamak gerek olmamalıdır. Ancak, getMd51 function kabul WideString. Ki çift kontrol etmelisiniz Eğer herhangi bir yere göndermeden önce aksi takdirde, veri kaybetme olabilir.

Sonra, PHP UTF-8 veri alma sorunu var. Orada veya MySQL yapmanız gereken özel bir şey yok bekliyoruz. Saklamak ne olursa olsun, aynı sonra geri almalısınız. Delphi programı bu geri göndermek ve geri WideString içine UTF-8 veri çözmek.

UTF-8 olarak depolamak çünkü başka deyişle, Unicode veri will sizin veritabanında farklı görünüyor. Senin veritabanında, UTF-8 kodlanmış verileri görüyoruz, ancak TNT kontrollerde, normal Unicode karakterleri görüyoruz.

Eğer Editbox'a karakteri "ش" yazarsanız Yani, örneğin, Unicode karakter U 0634, Arapça harf parlaklığındadır. UTF-8 gibi, bu iki-byte dizisi 0xD8 0xB4. Eğer veritabanında bu bayt depolamak ve daha sonra ham alanın içeriğini görüntülemek, bu bayt bazı ANSI kodlamasında olarak da yorumlanan karakterler görebilirsiniz. Bu bayt Bir olası yorumlama aksan tarafından takip inme ile o Latin harf olan iki karakter dizisi "Ø '", olduğu gibi.

Geri veritabanından bu dizeyi yüklediğinizde, yine de bunu saklandığı zaman olduğu gibi, UTF-8 olarak kodlanmış, bu yüzden bunu çözmek gerekir. Bildiğim kadarıyla söyleyebilirim, PHP veya MySQL ne herhangi bir veri Masaj yapar, bu yüzden olduğu gibi-onları size iade edilecektir vermek ne olursa olsun UTF-8 karakter. Eğer Delphi verileri kullanıyorsanız, o zaman önceden denilen Utf8Encode işlevi tamamlayıcısı olan Utf8Decode diyoruz. Eğer PHP verileri kullanıyorsanız o ISO-8859-1, bizim örnek Arapça karakter içermez dönüştürür, ancak o zaman, PHP'nin utf8_decode fonksiyonu ilginizi çekebilir. Yığın taşması zaten PHP UTF-8 kullanarak ilgili bir kaç soru var, bu yüzden ben burada onlara eklemek için denemez. Örneğin:

Uygulama UTF-8 veri kodlamak / x-www-form-urlencoded. Bu sunucu http bağlantısı üzerinden veri okumak sağlayacaktır

Ben çıktı bunları & # nnnnn kişiler olurdu ki (kesin olarak bilmeden) beklediğiniz (yerine onaltılık daha ondalık sayı ile ... Bence)