Yazar |
|
rambo
Kayıt: 16.10.2008 |
|
merhaba,
mysql veritabanına kaydedilmek üzere kullanıcının girdiği metnin içinde geçmesi muhtemel olan bazı karakter sınıflarını (örneğin garip karakterler kullanılarak Türkçe kelimeler falan yazılıyor bazı forumlarda) engellemek istiyorum. kastettiğim karakterler sanırım ascii 0-255 aralığında bulunmuyor ve ben de karakter seti olarak utf-8 kullanmıyorum. veritabanı için latin5 http için ise iso-8859-9 kullanıyorum. bu nedenle bunları nasıl süzebileceğimi bulamadım.
normalde iso-8859-9 ile post yaptığımda bu tip karakterlerin sunucuya nasıl aktarıldığı hakkında bir fikrim yok. forma yabancı karakter girilerek gönderildiğinde php içindeki geçerli karakter seti kendiliğinden utf-8 olarak değişiyor mu? bütün bunları kontrol altında tutmak istiyorum. bu konuda tecrübeli arkadaşların yorumlarını bekliyorum.
teşekkürler...
rabbit rambo rulezzz
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
Sunucunun karakter kodlaması ne ise, sen değiştirmediğin sürece varsayılan olarak onu kullanır. Dolayısıyla karakter değişikliği yapmak istiyorsan herzaman sabit bir kodlama kullanmanı öneririm.
ISO da olsa UTF-8 de karakterler string değer olarak aynıdır fakat karakter numaraları seçmiş olduğun encodinge göre değişiklik gösterir. Birinde 100 x e denk gelirken diğerinde Y ye denk gelebilir. Karakter kodundan değişiklik yapacaksan hatalı bir işlem yapmış olursun.
Tam olarak nerede kullanacaksın bu fonksiyonu bilmiyorum fakat benim tavsiyem karakterleri veritabanına olduğu gibi sokman sonra da gösterirken değiştirmek istediğin şeyleri değiştirmen olur.
N/A
|
|
Yazar |
|
rambo
Kayıt: 16.10.2008 |
|
░▒▓■□▪▫▬▲►▼◄◊○●◘◙◦☺☻☼♀♂♠♣♥♦♪♫
yukarıdaki karakterler bu mesajımda görünür mü bilmiyorum ama kastettiğim bunlar gibi 0x21-0xFF aralığı dışındaki karakterler. ben bunları tespit edip katardan temizlemek istiyorum. çünkü böyle karakterler latin5'de "Incorrect string value" hatası nedeniyle veritabanına kaydedilmiyor. şimdilik veritabanını karakter setini utf-8 olarak değiştirmeyi düşünmüyorum. ama eğer php ile bu temizliği yapamazsam field'ları utf-8 yapacağım son çare olarak.
rabbit rambo rulezzz
|
|
Yazar |
|
burakkanmaz
Gaziantep
Kayıt: 02.10.2006 |
|
Aşağıdaki kod işine yarayabilir
<?PHP
function char_replace($string)
{
$string = str_replace("◄", "", $string);
$string = str_replace("▼", "", $string);
$string = str_replace("►", "", $string);
$string = str_replace("▲", "", $string);
return($string);
}
?>
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
Öyle yapmak yerine şey yap. İzin verilen karakter listesini bir arraye at onların dışındakileri kabul etme. Çünkü karakter kodundan temizlik yapmaya çalışırsan kodlar tutmayacaktır.
N/A
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
iucoders in veritabanı latin5 bu karakterlerde bende düzgün çıkıyor. senin derdin başka birşey olması lazım.
N/A
|
|
Yazar |
|
rambo
Kayıt: 16.10.2008 |
|
burakkanmaz yazdi | Aşağıdaki kod işine yarayabilir
<?PHP
function char_replace($string)
{
$string = str_replace("◄", "", $string);
$string = str_replace("▼", "", $string);
$string = str_replace("►", "", $string);
$string = str_replace("▲", "", $string);
return($string);
}
?>
|
teşekkür ederim ama izin vermediğim karakterlerin tamamı için bu işlem çok zahmetli olur. ayrıca dosyayı utf-8 olarak kaydetmek gerekiyor. üstelik editörler de (dw) böyle karakterler ile çalışırken sapıtıyorlar. regular expression kullanmayı denedim ama 0x0100-0x00FF aralığını tanımıyor. izin verilen aralığı (0x21-0xFF) belirleyip not yaparak preg_replace yaptığımda da temizlik yapmıyor.
şimdilik
$str = iconv('UTF-8', 'ISO-8859-9', $str);
kullanıyorum. o da geçersiz karakterden sonrasını atıyor. bu denemeleri elle yazarak yaptım, dolayısıyla dosyanın formatının da utf-8 olması gerekiyor. henüz http post verileri üzerinde test yapmadım. belki i/o karakter setlerini ayarladığımda istenmeyen karakterler kendiliğinden süzülebilir.
bir de php'de mulitbyte string fonksiyonları varmış. belki de aradığım yanıt onların içinde vardır. bu multibyte string fonksiyonları hakkında bilgisi olan varsa paylaşabilir mi? bu işte yeni sayılırım. fırsat bulduğumda bu konulara kendim de çalışacağım ama bir bilen yardım ederse bu konuda çok zaman kazanabilirim.
tekrar teşekkür ederim ilginiz için.
rabbit rambo rulezzz
|
|
Yazar |
|
rambo
Kayıt: 16.10.2008 |
|
orhan yazdi | iucoders in veritabanı latin5 bu karakterlerde bende düzgün çıkıyor. senin derdin başka birşey olması lazım. |
sayfa kaynağında bütün karakterlerin html entity süzgeçinden geçtiği görülüyor. yani hepsi veritabanına o şekilde kaydedilmiş :)
ben de htmlentities fonksiyonunu deneyeceğim, sonuçları burada paylaşırım.
rabbit rambo rulezzz
|
|
Yazar |
|
rambo
Kayıt: 16.10.2008 |
|
bugün http post kullanarak bazı denemeler yaptım.
1) formu gönderen sayfanın karakter seti örneğin ISO-8859-9 olduğunda karakter setine aykırı olan karakterler tarayıcı tarafından html entity olarak encode edilerek sunucuya gönderiliyor.
yani ♥ karakteri ♥ koduna dönüştükten sonra sunucuya gönderiliyor. bu nedenle bu tip karakterleri özellikle bir süzgeçten geçirmeye gerek kalmıyor.
2) formu gönderen sayfanın karakter seti UTF-8 ise bütün karakterler (sanırım) olduğu gibi sunucuya gönderiliyor. fakat interpreter ile mysql arasındaki köprü "latin5" olarak ayarlandığında eldeki karakterler latin5'e göre şekil alıyor.
yani ♥ karakteri 0xE299A5 olarak sunucuya gönderildiği halde, 3 byte'dan oluşan bu karakter köprüde 3 farklı karaktere ayrılıyor (0xE2, 0x99 ve 0xA5) ve bu şekilde 3 farklı karakter olarak sorunsuzca latin5 olarak ayarlanmış field'a kaydedilebiliyor.
buna göre karakter seti latin5 olan field'lara sorunsuzca veri kaydetmek için bağlatıyı latin5 olarak ayarlamak yeterli sanırım. ben behsettiğim hatayı phpmyadmin ile çalışırken alıyordum ve phpmyadmin mysql bağlantısını utf-8 ile yaptığı için "incorrect string value" hatasını alıyordum sanırım.
mysql_query('set names latin5');
rabbit rambo rulezzz
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | | |