indy karakter sorunu.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: indy karakter sorunu.

Mesaj gönderen xxxjedixxx »

Sanırım soruyu yanlış anlıyorlar yada ben yanlış anlıyorum. Benim anladığım; bir URL içine yerleştirdiğin metni düzgün gönderememek. Aşağıya senin için uğraştım ve bir fonksiyon yazdım. Browserlarda fark etmişsindir ki bazı metinlerin içindeki karakteri HEX olarak gönderir. Örneğin boşluk karakteri için %20 yazar. Bende bunun gibi bir mantıkla göndereceğin metni çeviren bir fonskiyon yazdım. Kendim ASP üzerinde testtim metinler düzgün gidiyor. Metni URL'ye StrtoUrlStr fonsiyonundan geçirip koyarsan düzgün gidecektir.

Kod: Tümünü seç

function StrtoUrlStr(pStr: string): string;
const TRChars: array [0..12] of Char = (' ', 'ç', 'ı', 'ğ', 'ö', 'ş', 'ü', 'Ç', 'İ', 'Ğ', 'Ö', 'Ş', 'Ü');
var i: Integer;
begin
  Result := pStr;
  for i := 0 to High(TRChars) do
  if Pos(TRChars[i], Result) > 0 then
    Result := StringReplace(Result, TRChars[i], '%' + IntToHex(Ord(TRChars[i]), 2), [rfReplaceAll]);
end;

// test
procedure TForm1.Button2Click(Sender: TObject);
var Str: string;
begin
  Str := 'Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Test çşğüöıİĞÜŞÇÖ';
  Memo1.Text := StrtoUrlStr(Str);
end;

En son xxxjedixxx tarafından 08 Nis 2014 02:42 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: indy karakter sorunu.

Mesaj gönderen esistem »

UTF8Encode ve UTF8Decode fonksiyonları zaten sizin yazdığınız çevirme işini yapıyor diye biliyorum ben.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: indy karakter sorunu.

Mesaj gönderen xxxjedixxx »

Hayır yapmıyor. UTF8Encode "Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz." şeklinde sonuç veriyor.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: indy karakter sorunu.

Mesaj gönderen esistem »

Eğer ASP dosyanızın meta taglarına

Kod: Tümünü seç

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
ekleyip, sorguyuda UTF8Encode(sorgu) şeklinde gönderirseniz, aynı işi yaptığını görebilirsiniz. Burada önemli olan gönderdiğiniz karakter setinin hangi dile göre encode edilip hangi dile göre decode edileceğidir. Encode UTF-8 decode windows-1254 olursa tabiiki farklı sonuçlar alırsınız.

Dolayısı ile burada önemli olan idhttp ile bağandığınız web sitesinin charset meta tag'ıdır. Onu bilirseniz zaten çözümü bulmuş olursunuz.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: indy karakter sorunu.

Mesaj gönderen xxxjedixxx »

Sayın esistem,

Sen farklı bir şeyden bahsediyorsun. Ben sorunun postagüvercini.com sitesine (muhtemelen sms gönderiliyor) url parametreleri ile bilgi gönderirken türkçe karakterilerin düzgün gitmediğini anlıyorum. Verdiğim örnekteki gibi hex olarak gönderilirse hiç bir sorun olmayacaktır. Saygılarımla,
theSinan

Re: indy karakter sorunu.

Mesaj gönderen theSinan »

Kod: Tümünü seç

AnsiString *Strm;
AnsiString *veri;

veri ="türkçe_karakter_çözüm_çalışması";
veri =UTF8Encode(veri);
Strm =IdHTTP1->Get("http://www.postaguvercini.com/api_http/sendsms.asp?user=kullanıcı_adi&password=şifre&text="+veri);
Strm =UTF8Decode(Strm);
Memo1->Text = Strm;
bu şekilde

veri ="türkçe_karakter_çözüm_çalışması"; satırındaki hata Cannot convert 'char const[32]' to AnsiString
veri =UTF8Encode(veri); satırındaki hata could not find a match for 'UTF8Encode(string *)'
yine aynı hataları veriyor
işin ilgin kısmı
veri değişkenine atadığım deger char değilken neden char olarak görüyor AnsiString çevirmeye çalışıyorken hata veriyor anlıyamamıyorum
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: indy karakter sorunu.

Mesaj gönderen esistem »

birde xxxjedixxx arkadaşın yazdığı gibi deneyin isterseniz belkide ben yanlış düşünüyorumdur. verdiği hatada da bir eşleşme bulunamadı gibi bişi diyor sanırım. bir yerde bi hata var ama.
theSinan

Re: indy karakter sorunu.

Mesaj gönderen theSinan »

xxxjedixxx hocam tam üstüne bastınız sorunum aynen dediğiniz gibi
teknik servis programımıza sms ile müşteri bilgilendirme özelliği eklemeye çalışıyorum
türkçe karakterler ? işareti olarak gidiyor ve çok kötü bir durum
fonksiyonunu c++ cevirmeye çalışayım bakalım inşallah derdime derman olacaktır
postaguvercini.com giden verinin iso-8859-9 charsetinde olması gerekiyor
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: indy karakter sorunu.

Mesaj gönderen xxxjedixxx »

C++ koduna çevirdikten sonra doğruluğunu anlamanız için;

"Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz."

metni için

"Firebird%20ve%20Interbase%20veritabanlar%FD%20ve%20SQL%20komutlar%FDyla%20ilgli%20sorular%FDn%FDz%FD%20sorabilirsiniz."

sonucunu bulmalısınız.

İsterseniz hemen bu dönüştürülmüş metni browser'da url üzerine yerleştirerek deneyin. Çalışmazsa boşuna C++'ye çevirmeyin :)
theSinan

Re: indy karakter sorunu.

Mesaj gönderen theSinan »

hocam fazla oluyorum
kusuruma bakmayın
pascal bilmiyorum
Result sanırım fonksiyondan donüş mü oluyor
değişken olarak tanımlanmamış ancak siz gelen pStr ti Result ' a atamışsınız
bu for i := 0 to High(TRChars) do satırında İ degeri TRChars uzunluğuna erişinceye kadar dönsün demişsin
ancak ben c++
for (int i=0 ; i < ((int) strlen(TRChars)) ; i++)
ile i TRChars değişkeninin uzunluğuna erişinceye kadar dön yazınca
cannot convert 'const int' to 'const char *' hatası veriyor

bu

Kod: Tümünü seç

StringReplace(Result, TRChars[i], '%' + IntToHex(Ord(TRChars[i]), 2), [rfReplaceAll]);
satırı ise zaten hiç anlamadım
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: indy karakter sorunu.

Mesaj gönderen esistem »

Kod: Tümünü seç

for (int i=0 ; i < ((int) 12) ; i++)
şeklinde yazmalısınız sanırım, array in kaç öğeye sahip olduğunu c++ da nasıl yazıyosunuz bilmediğimden böyle yazdım.
const TRChars: array [0..12] şeklinde 13 farklı değer almış olduğundan dolayı 0 dan 12 ye kadar saydırmanız yeterlidir.

Kod: Tümünü seç

StringReplace(Result, TRChars[i], '%' + IntToHex(Ord(TRChars[i]), 2), [rfReplaceAll]);
satırında ise; StringReplace : bul değiştir anlamında kullanılıyor. açılımı şu şekildedir.

Kod: Tümünü seç

StringReplace(string deger, değiştirilecek karakter, yeni değeri, parametre:[rfReplaceAll]);
StringReplace('Merhaba', 'M', 'm', [rfReplaceAll]); // çıktısı merhaba olacaktır.

Kod: Tümünü seç

IntToHex(Ord(TRChars[i]), 2)
ise : önce bulunan karakterin ascii tablodaki 0..255 arası kodunu bul, sonra bunu hexedecimal değere çevir, anlamındadır.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: indy karakter sorunu.

Mesaj gönderen xxxjedixxx »

esistem açıklamış. Ben de biraz yardımcı olmaya çalışayım. Bu kadar uğraşmadan önce daha önce dediğim gibi direkt url'ye dönüştürülmüş metni yazıp denersen iyi olur. Çalışmazsa bu kadar uğraş boşa gidecek.

Result, senin de anladığın gibi delphi tarafından otomatik oluşturulan fonksiyonun geri dönüş değeri.

StringReplace ile ilgili olarak http://docwiki.embarcadero.com/Librarie ... ingReplace linkine bir bak.

TRChars bir matris (array), string değil.
High(TRChars) değişkenin son index numarasını verir. Bu örnekte bu değer 12 olacaktır. Şurada bir şeyler anlatmışlar. https://answers.yahoo.com/question/inde ... 812AAByvv9

Ord fonksiyonu ise karaterin ASCII kodunu verir.

InttoHex ise tam sayının HEX karşılığını verir. 2 parametresi ise sonucun 2 karakterli olmasını sağlıyor. Yani 10 tam sayısı için Hex karşığı "0A" oluyor.

Pos fonksiyonu ise aranan metnin veya karakterin kaynak metin içinde kaçıncı pozisyonda olduğunu verir. Burada if Pos(...) > 0 ile varmı yokmu kontrolü yapıyorum. Çok şart değil sadece gereksiz değiştirme işlemi yapmamak içindi.
theSinan

Re: indy karakter sorunu.

Mesaj gönderen theSinan »

s.a
hocam Türkçe Karakterleri HEx değerlerini nasıl bulabilirim

c++ String i char cevirme biraz dert belkide bana öyle geliyor
şimdilik söyle

Kod: Tümünü seç

String sString="Türkçe Karakterleri CEVİRMe ÇÖZÜM ÇALIŞMASI";
String Eski[30]={" ", "ç", "ı", "ğ", "ö", "ş", "ü", "Ç", "İ", "Ğ", "Ö", "Ş", "Ü"};
String Yeni[30]={"%20", "c", "i", "g", "o", "s", "u", "C", "I", "G", "O", "S", "U"};


for(int i=0;i<=12;i++)
	{
	 sString=StringReplace(sString,Eski[i],Yeni[i],TReplaceFlags() << rfReplaceAll);
}
Memo1->Lines->Add(sString);

bir deneme kod yazdım bakalış istediğim sonucu alabilecekmiyim
eger istediğim sonucu olursa cevirme işini bir şekilde yapmaya çalışacağız
theSinan

Re: indy karakter sorunu.

Mesaj gönderen theSinan »

hocam c++ harfin ascii kodunu bulmak için önce char ceviriyorum
sonra char olan harfi int değişkene atadığım zaman ascii kodunu veriyor( yani ben böyle yapıyorum belki yanlış yapıyorum ama ben bu yoldan gidiyorum)

bir fonksiyon yaptım ama char int cevirirken kafayı yiyiyor

Kod: Tümünü seç

using namespace std;

 void StrCharCevirme(string x)

 {
char *y = new char[x.length() + 1]; // or
int iSayi;
strcpy(y, x.c_str());
for(int i=0;i < (x.length()+1);i++)
	{
	iSayi=y[i];
	Form1->Memo1->Lines->Add(y[i]+": Charın intsi ="+IntToStr(iSayi)+" = Hexesi"+IntToHex(iSayi,2));
	}

 }

// kodu çalıştıran button clicki

void __fastcall TForm1::Button2Click(TObject *Sender)
{

StrCharCevirme("Türkçe Karakterleri CEVİRMe ÇÖZÜM ÇALIŞMASI") ;

}



acayip degerleri çıkıyor
kod mantıken dogru çalışması gerekiyor
ama istediğim sonucu alamıyorum Memoya ekliyorum çıkan sonuç hüsran
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: indy karakter sorunu.

Mesaj gönderen esistem »

Kod: Tümünü seç

 void StrCharCevirme(string cikti)
 {
char TRChars [13] = { ' ', 'ç', 'ı', 'ğ', 'ö', 'ş', 'ü', 'Ç', 'İ', 'Ğ', 'Ö', 'Ş', 'Ü' }; 
int i;
for(int i=0;i < 12;i++)
   {
int ascchar = TRChars[i];
cikti = StringReplace(cikti,TRChars[i],'%'+IntToHex(Byte(ascchar),2),TReplaceFlags() << rfReplaceAll);
   }
 }
Sanırım yukarıdaki gibi bişi yazman lazım, anlayabildiğim kadarı ile yazmaya çalıştım fonksiyonu,
cikti değişkenini nasıl dışarıya verirsin onu bilemiyorum ama.
En son esistem tarafından 09 Nis 2014 09:12 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Cevapla