Turning gears are the logo of co-scripts

Genelde başka bir url'den html çektiğimizde  (ASP ile) ayıklama ihtiyacı duyarız. Ayıklayacağımız kısım basit ise Replace işimizi görebilir. Ancak karmaşık ve sayıca fazla ise html metnini belirli karakter katarlarına göre Split ederek ayıklama yöntemini seçeriz.

Bu örneğimizde google adsense gibi reklam js kodları içeren bloklarını Split döngüsünde ayıklayan bir örnek kod vereceğiz.

 

Do While InStr(metin,"<script")>0

metinler = Split(metin,"<script")

cikacakKisim = Split(metinler(1),"</script>")

metin = Replace(metin,"<script"&cikacakKisim(0)& "</script>","")

Loop

Not: Kod kısmında boşluklar renklendirici hata vermesin diye bırakılmıştır.

co-scripts tag image html parsing with aspasp ile html ayiklamascript blogu ayiklamaparsing script blocks from htmlparsehtml
ID:253 | Okunma:2144


 

Merhaba,

Başka bir Türkçe karakter sorunu yazısında tekrar birlikteyiz. Çok itici bir giriş oldu belki ama farklı platform ve araçlarla çalışanların sürekli başına gelen bir problem. Ve bu problem başladığında projenin geri kalanının anlamı kalmıyor ;)

Hala çok az bilgim olan bir konuda size 2-3 ipucu vereceğim. Karakter verisi iki şekilde görünür, birincisi hafızada yer aldığı formu, diğeri kullanıcının arayüzünde sergilendiği formu. Veri tabanları bizim görmek istediğimiz formatta tutmak zorunda değillerdir. yine de veri kaybına uğramamaları için olası görüntülenecekleri dilin verileriyle saklanmaları temel limittir. 

Başıma gelen olayda MSSQL sunucu da tutulan metin bazlı verilerin nvarchar tipinde olması gerektiğini önceden öğrenmiştim. Bazen ntext yada char sorun çıkartabiliyordu. Hala bunların neden böyle olmaları gerektiğini kesin olarak bilmiyorum.

Veriyi mssql ve mysql gibi sql sunucular Collation isminde bir tip özelliğiyle (dil kodu) birlikte saklıyor ve sunuyorlar. Şuradan detaylı temel bilgiler alınabilir. Collation tablosu (listesi) burada görülebilir. Garip bir çeviri ile MS'in yazısı burada, SQL ile collation desteğini çevirebilmek için güzel bir trick örneğini buradan görebilirsiniz.

Gelelim ASPUpload'un konuyla ilişkisine. Bildiğimiz gibi veritabanına kayıt yapan .asp sayfamızın kodlamasına eskiden hiç dikkat etmezdik.

Ancak Türkçe Collation kullanan bir tablomuz varsa (MSSQL de) ve bir upload formu kullanarak metin verisi de gönderiyorsak üstelik sayfamız utf8 ile kodlanmışsa ASP içinden session, codepage,response metodları çok kar etmiyor.

Türkçe dil sorunlarını görüntüleme kısmında yani kullanıcı tarafında nasıl çözüldüğünü şu yazıda belirtmiştik. Ancak upload formunun getirdiği multipart verisinin metin kısmı için utf-8 kodlu sayfalarda mssql'e karakter bozulması olmadan girebilmesi için Set Upload = Server.CreateObject("Persits.Upload") kodu ile oluşturulan upload nesnesine ait CodePage kullanılmak zorunda. Hemen alt satıra şunları yazarak bu işi çözmüş oluyoruz.

Upload.CodePage = 65001 kaynak

Detaylı bilgiyi üstte verdiğim kaynaktan alabilirsiniz.

En başta bana sonra başkasına yardımı dokunur diye bu kodları bir yerlerde toplama ihtiyacımdan meydana gelen bu sitedeki yazılardaki amatörlüklerin hoş görülmesi dileğimle.

co-scripts tag image aspuploadmssql karakter sorunuutf8upload.codepagecodepageunicode
ID:223 | Okunma:3913


 

Karşılaşılan sorun düzenlediğimiz html,asp veya php sayfasının sunucuya yolladıktan sonra kullanıcıya gönderdiği halinde Türkçe karakterlerin doğru görünmemesi veya hiç görünmemesi şeklide kendini gösteriyor.

Ben bir süredir beni oyalayan sorun için biraz araştırma yaptım ve ASP sayfaları için bir çözüm ürettim (elbette internet taramalarında bu sonuca vardım.) Ancak sanıyorum varsayılan ayarları US yada UK İngilizcesi olan sunucularda bu çok fazla işe yaramayabilir.

Bu yazıdaki kodlara bakınız.

 

Aşağıdaki standart makalelerinde ve yetkili kurum sayfalarında gerekli açıklamalar mevcut.

Response.Charset , Response.CodePage , Session.CodePage ,W3C Character Encodings , Character Set ,UTF-8, Setting HTTP Charset

Notlar: 

  • Metin temelli ASP, html, htm, js, vbs, php, css, xml gibi dosyalarınızı BOM1,2 bilgisi içermeyen utf-8 tipinde kaydedin
  • Metin editörünüzün kayıt ayarlarını BOM'suz utf-8'e çevirin
  • Dil ek bilgisi taşıyan ANSI tipindeki metin temelli dosyalarınızı da utf-8'e çevirin.
  • Dosyaları (klasörün tamamını da) ANSI'den utf-8 e topluca çeviren yazılımlar vardır.
  • 65001 kodu UTF-8'i işaret eder
  • include tekniğinde içerilen (çağrılan) sayfa ana sayfanın karakterseti ve kod sayfası tipine uyabilir ama uymama olasılığı da var.
  • server.execute tekniğinde çalıştırılan sayfa ana sayfanın karaktersetini taşımaz ve kod sayfası tipine uymaz.
  • Sayfanızın browser tarafından yanlış encode edilmemesini garantilemek için en son olarak sayfanızın head kısmı içine 
     
    

    kodunu eklemeyi unutmayın.
  • CSS dosyasının en üstünde @charset "UTF-8"; olarak kullanabilirsiniz. Böylece css dosyanız ile stil verdiğiniz html dosyası aynı encode içerirler.
  • Apache sunucuda .htaccess ile karakter encoding
  • Sunucunuzdaki veritabanı özellikle sql ise collation başka bir dilde olabilir. Kontrol etmelisiniz.
  • BOM nedir? Kısaca fazladan karakter tanımlamak için oluşturulmuştur. (Byte Order Mark). Özellikle metin tabanlı dosyanın başına hatalı algılanan karakterler yerleştirir ve farklı bir kayıt tipidir. UTF-8 için gereksizdir denebilir. UTF-16 da kullanımı yaygındır. Standart utf-8 kullanmadığınızda Header bilgisini bozduğundan hata verdirir. BOM'lu utf-8 genellikle dosya TR karakter içeriyorsa sorun çıkartır. Tüm editörlerde BOM'suz utf-8 kayıt mümkündür.
  • Dil kodu belirtme önceliği şu şırayladır.
  •  
  • 1- HTTP Content-Type
  • 2- XML deklare etme
  • 3- Meta charset deklare etme
  • 4- Link charset özelliği
co-scripts tag image turkce karakter sorunuutf-8bomansiencoderesponse.charsetresponse.codepage
ID:206 | Okunma:10950


 

Asp sayfalarımızda, html sayfalarımızda ve ajax uygulamalarımızda sıklıkla karşılaşılan Türkçe karakter sorununa elbette internetten ulaştığımız bir bilgi ile çözüm bulduk.

Metin tabanlı dosyalar kaydedilirken belli bir formatta kaydedilirler. Bu format bilgisi içinde karakter destekleri de vardır. ASP,HTML,JS gibi dosyaları kaydederken en az problem çıkartabilecek utf-8 i tercih ediyoruz.

Bu dosyanın çalıştırılması sonucu üretilen çıktıların browserda görüntülenmesi sırasında doğru görüntülenmesi ve sunucudan doğru gönderilmesi için tüm dosyalarımızda şu belirteçleri kullanıyoruz.

 

ASP için (html içinde ayrıca meta tagı kullanıyoruz)

response.charset="ISO-8959-9" 
Session.Codepage = 1252
Response.Codepage = 65001

Buradaki 1252 ve 65001 utf-8 içeriği taşıdığını bildiriyor sunucuya, sunucuda ona göre kodlayarak yolluyor karakterleri.

 

Ajaxta :

Response.ContentType = "text/xml" 

kullanıyoruz ek olarak.

HTML içinde ayrıca browser'a anlatmak için meta tagları kullanıyoruz.

co-scripts tag image karakter kodlamakarakterencodingcodepagecharsetturkce-karakter-sorunuutf-8iso-8959-9125265001windows-1254
ID:200 | Okunma:5121


 

Zengin metin düzenleyicileri Türkçe karakterleri -doğru görüntülenmelerini garantiye almak için- HTML entities olarak kaydedebilirler. Bu RSS standartlarında sorun yaratır ve doğrulamayı geçemez.

Bunun için bir çevirici yazabiliriz. ASP(vbs) ile bir örneği aşağıdadır. Konuyla ilgili şu sayfalara bakabilirsiniz 1,2,3,4

Function HTMLnonASCIIconvertTR(MyNonASCII)
htmlNA ="Ç,ç,Ğ,ğ,İ,ı,Ö,ö,Ş,ş,Ü,ü"
htmlTR ="Ç,ç,Ğ,ğ,İ,ı,Ö,ö,Ş,ş,Ü,ü"
hNA = Split(htmlNA,",")
hTR = Split(htmlTR,",")

For NA2TR = 0 To UBound(htmlNA)
MyNonASCII = Replace(MyNonASCII,hNA(NA2TR),hTR(NA2TR))
Next
HTMLnonASCIIconvertTR = MyNonASCII 
End Function

Değerlerin tablosunu şu sayfadan aldım.

co-scripts tag image rsshtml-entitiesnon-asciikarakter cevrimiturkce-karakter-sorunu
ID:182 | Okunma:1993


 

co-script için rss feed yapmaya çalışırken tarihin hatalı olduğu uyarısını şuradan validate ederken öğrendik efendim. Kendim yazmak yerine interneti taramaya başladım. Bu hem tembellik hemde başkaları nasıl yaklaşmış görmek için bir meraktı. Tarih tipi veriler ve işlemleri oldum olası beni korkutur. Her memleketin kendi tarih formatının olmasına bir de her kurumun kendi standartları eklenince çıldırmamak elde olmuyor. Nispeten eski bir standart olsa da rss feed'ler için zorunlu kılınan bu RFC 822 formatını kullanıyoruz. 

İnternetten ASP ile yapılmış en sade ve güzel kodu alıp kullandım. Türkçe sunucu kullanıldığında session.LCID değerini önce 1033 (İngiliz) yapıyoruz (gün ve ay kısaltmaları Türkçe çıkar yoksa). İşimiz bitince tekrar 1055 (Türkçe)'e çeviriyoruz. 

Kodu aldığım yer burası ve yazan yakışıklı uzmanımızın sayfası da burası. Bu arada LCID'ler arasında cirit atabilmek için sunucudan bu desteğin açılmış olması gerekebiliyormuş. Bizde gerekmedi ama varsayılanı Eng olan sunucularda olabilir!

RFC Standartları ile ilgili olarak  şuraya bakabilirsiniz. Feed Validation w3c sayfası için buraya bakabilirsiniz.

Şimdi kodlarımız:

Function return_RFC822_Date(myDate, offset)
'session.LCID = 1033
Dim myDay, myDays, myMonth, myYear
   Dim myHours, myMonths, mySeconds

   myDate = CDate(myDate)
   myDay = WeekdayName(Weekday(myDate),true)
   myDays = Day(myDate)
   myMonth = MonthName(Month(myDate), true)
   myYear = Year(myDate)
   myHours = zeroPad(Hour(myDate), 2)
   myMinutes = zeroPad(Minute(myDate), 2)
   mySeconds = zeroPad(Second(myDate), 2)

   return_RFC822_Date = myDay&", "& _
                                  myDays&" "& _
                                  myMonth&" "& _ 
                                  myYear&" "& _
                                  myHours&":"& _
                                  myMinutes&":"& _
                                  mySeconds&" "& _ 
                                  offset
'session.LCID = 1055
End Function 

Function zeroPad(m, t)
   zeroPad = String(t-Len(m),"0")&m
End Function

Kodların içindeki LCID değiştirmelerinin başına yorum işareti koydum onları kaldırırsanız çalışır. Eğer fonksiyon içinde sürekli değiştirmek istemezseniz -ki bu fonksiyonu sıklıkla rss için kullanacaksanız fonksiyonu çağırdığınız yerlerin başına ve sonuna koyarak bir kez LCID değiştirmiş olursunuz.

Fonksiyonun kullanımı:

 

response.write return_RFC822_Date(Now, "GMT")
'GMT yerine EST veya +0200 gelebilir
'Now yerine de herhangi bir tarih gelebilir, tarih formatında olmalı

 

Ya da isterseniz yorum tırnaklarını kaldırıp doğrudan kullanınız.

Kolay gelsin

co-scripts tag image rfc-822lcid10331055return_rfc822_dategmtestrssfeed
ID:156 | Okunma:1891


 

Hızlıca konuya giriyorum. VBScript ile ASP yazanlar bilirler bir sayfanız vardır ve <form> içerir. Bu forma veriler girildikten sonra karşı tarafta bu verileri request.form(formElementiAdı) şeklinde alırız. Ancak çok büyük formlarda bu ciddi sıkıcı bir yazım süreci gerektirir. Genellikle bir IDE ile bu sorunu aşabilirsiniz. Ama NotePad++, Edit Plus gibi bir metin editörü kullanıyorsanız deneyebileceğiniz bir şey var.

Form  elementinin tüm alt elementleri (child) karşıdaki ASP dosyasına bir koleksiyon içinde gönderiliyor. Request.Form. Bu koleksiyonu tüm diğer koleksiyonlar gibi vbscript ele alabiliyor. ASP yardımında da belirtilen şu örnekle bunu görebiliyoruz.

<% For Each x In Request.Form %> Request.Form( <%= x %> ) = <%= Request.Form(x) %> <BR> <% Next %>

Buraya kadar ok. Ama bunları birer değişkene atamak istediğimizde tek tek değerlerini alıp yerleştirmek gerekecekti.

Kodu şu şekilde değiştirip, üretilen html'i tekrar  ASP kaynak koduna yapıştırırsak bir miktar enerji ve zaman kazanmış oluruz.

<% For Each x In Request.Form %>

deger_<%=x%> = Request.Form(" <%= x %> ") <BR>

<% Next %> 

co-scripts tag image form koleksiyonufor eachrequest.form
ID:126 | Okunma:1467


 

Merhaba,

Uzun lafa gerek yok. IIS üzerinden asp ile- CDO yardımıyla- google (gmail) hesabınızı kullanarak e-posta yollayabilirsiniz. Sitenizin çok yoğun bir e-posta gönderme trafiği yoksa ideal bir yöntem. Daha önce de C# örneğini vermiştik.

No:İnternetten öğrendiğim bu kodların kaynağını hatırlamıyorum. Yazana teşekkür ederim.

 
Function maille(kime,recevap,konu,mesajGovde)
'==================================  MAİL FONKSİYONU============================		
mesajGovdesi="Maile gidecek yazı burada olsun"
Dim iMsg, iConf, Flds
Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields
schema = "http://schemas.microsoft.com/cdo/configuration/"
Flds.Item(schema & "sendusing") = 2
Flds.Item(schema & "smtpserver") = "smtp.gmail.com"
Flds.Item(schema & "smtpserverport") = 465
Flds.Item(schema & "smtpauthenticate") = 1
Flds.Item(schema & "sendusername") = "adresiniz@gmail.com"
Flds.Item(schema & "sendpassword") = "buraya_sifrenizgelsin"
Flds.Item(schema & "smtpusessl") = 1
Flds.Update
 
iMsg.To = kime
iMsg.From = "kimdengidiyorgorunsun@gmail.com"
iMsg.Subject = konu
iMsg.HTMLBody = mesajGovde
iMsg.Sender = "gonderen@gmail.com"
iMsg.Organization = "http://www.dogatr.org" ' Eğer kurumsal hesapsa buraya yazabilirsiniz
iMsg.ReplyTo = recevap
Set iMsg.Configuration = iConf
SendEmailGmail = iMsg.Send
Set iMsg = Nothing
Set iConf = Nothing
Set Flds = Nothing
End function

Kolay gelsin

co-scripts tag image cdogmaille mailgmailiis ve cdosendemail
ID:115 | Okunma:2726