Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
JSON UTF8 Sorunu
#1
Merhaba,

Aşağıdaki şekilde bir kullanımda Türkçe karakter sorunu yaşıyorum.

var

  JSON: TJSonValue;

JSON := TJSonObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strJSON),0);

Result := JSON.ToJSON;

Result := JSON.ToString; yazdığım zaman aslında sorun kalmıyor. (Türkçe sorununu yaşamıyorum) fakat üstteki UTF8 çevrimine rağmen JSON.ToJSON da Türkçe karakter sorunu neden oluşuyor, bu normal mi?

Teşekkürler.
Cevapla
#2
(05-05-2020, Saat: 00:26)pro_imaj Adlı Kullanıcıdan Alıntı: Merhaba,

Aşağıdaki şekilde bir kullanımda Türkçe karakter sorunu yaşıyorum.

var

  JSON: TJSonValue;

JSON := TJSonObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strJSON),0);

Result := JSON.ToJSON;

Result := JSON.ToString; yazdığım zaman aslında sorun kalmıyor. (Türkçe sorununu yaşamıyorum) fakat üstteki UTF8 çevrimine rağmen JSON.ToJSON da Türkçe karakter sorunu neden oluşuyor, bu normal mi?

Teşekkürler.


Merhaba...
Yeni bir projemde ben de benzer bir sorun yaşamaya başladım. 
Hosting üzerinde bulunan MySQL veritabanındaki tablolara kayıt yaptığım zaman Türkçe karakter sorunu yaşıyorum.

Örnek kodum aşağıda;

StrS:=TStringStream.Create(
                 //UTF8EncodeToShortString
'{'+'"CusId":"'+Customers.id.ToString+'",'+#13#10+
'"CusName":"'+UTF8EncodeToShortString(Customers.CustomerName)+'",'+#13#10+
'"Phone1":"'+UTF8EncodeToShortString(Customers.PhoneNumber1)+'",'+#13#10+
'"Phone2":"'+UTF8EncodeToShortString(Customers.PhoneNumber2)+'",'+#13#10+
'"Phone3":"'+UTF8EncodeToShortString(Customers.PhoneNumber3)+'",'+#13#10+
'"Adr1":"'+UTF8EncodeToShortString(Customers.Address1)+'",'+#13#10+
'"Adr2":"'+UTF8EncodeToShortString(Customers.Address2)+'",'+#13#10+
'"Adr3":"'+UTF8EncodeToShortString(Customers.Address3)+'",'+#13#10+
'"Discount":"'+Customers.Discount.ToString+'",'+#13#10+
'"CardNo":"'+UTF8EncodeToShortString(Customers.CardNo)+'",'+#13#10+
'"Detail":"'+UTF8EncodeToShortString(Customers.Details)+'"}');

   StrS.Position:=0;
   try
   idHTTP1:=TIdHTTP.Create(nil);
   idHTTP1.Request.ContentType := 'application/json';
   idHTTP1.Request.ContentEncoding := 'UTF-8';
   try
   sonuc := idHTTP1.Post(ServerIp+'CustomerSave.php', StrS);
   //showmessage(sonuc);
  except
     on E: Exception do
       ShowMessage('Error on request: '#13#10 + e.Message);
   end;


Sunucuda bulunan ve gönderdiğim json'u ilgili MySql tabloya yazan CustomerSave.php dosyamın içeriği de şu şekilde;

<?php
header('Content-Type: text/html; charset=utf-8');
include("connect.php"); 
date_default_timezone_set('Europe/Istanbul');

$json = file_get_contents('php://input');
$data = json_decode($json,true);

$_Id=$data['CusId'];
$_CusName=$data['CusName'];
$_Phone1=$data['Phone1'];
$_Phone2=$data['Phone2'];
$_Phone3=$data['Phone3'];
$_Adr1=$data['Adr1'];
$_Adr2=$data['Adr2'];
$_Adr3=$data['Adr3'];
$_Discount=$data['Discount'];
$_CardNo=$data['CardNo'];
$_Detail=$data['Detail'];

$result = mysql_query("SELECT * from m_customer where PhoneNumber1='$_Phone1' LIMIT 1 ");

$bulunan=0;
while($r=mysql_fetch_array($result))
{     
   $bulunan++;
}

if ($bulunan==0){

$sql="insert into m_customer 
(CustomerName, 
PhoneNumber1, 
PhoneNumber2,
PhoneNumber3,
Address1,
Address2,
Address3,
Discount,
MemberCardNo,
CustomerDetail)"; 

$sql.="values 
('$_CusName',  
'$_Phone1', 
'$_Phone2', 
'$_Phone3', 
'$_Adr1', 
'$_Adr2', 
'$_Adr3', 
'$_Discount',
'$_CardNo',
'$_Detail')";

if (mysql_query($sql)){ 
echo "OK"; } else { echo "Hata var!"; }

}

else {

$sql="update m_customer set ";
$sql.="CustomerName='$_CusName',
PhoneNumber1='$_Phone1',
PhoneNumber2='$_Phone2',
PhoneNumber3='$_Phone3',
Address1='$_Adr1',
Address2='$_Adr2',
Address3='$_Adr3',
Discount='$_Discount',
MemberCardNo='$_CardNo',
CustomerDetail='$_Detail' where PhoneNumber1='$_Phone1' ";

if (mysql_query($sql)){ 
echo "Tamamdır"; } else { echo "Hata var!"; } 



}

mysql_close($baglanti);

?>

İşin enteresanı bu kodlar kendi PC imde bulunan WampServer kurulu localhost da sorunsuz çalışıyor ve Türkçe karakterler de hem kayıtta hem de listelemede normal geliyor.
Sorun sadece Hosttaki veritabanına kayıtta meydana geliyor. 
MySql Veritabanı bağlantısında Character setleri de aşağıdaki şekilde yapıyorum.

mysql_query("SET NAMES 'UTF8'");
mysql_query("SET character_set_connection = 'UTF8'");
mysql_query("SET character_set_client = 'UTF8'");
mysql_query("SET character_set_results = 'UTF8'");

Sizce sorun nerede olabilir ?
Ne ekersen onu biçersin!  Idea
Cevapla
#3
Bu tip bir sorunla ilgili olarak connect.php içinde de utf8 ile ilgili bir düzeltme yaptığımı ve sorunun düzeldiğini hatırlıyorum.
$db = new PDO("mysql:dbname=$database;host=$host", "$username", "$password");
$db->exec("SET NAMES 'utf8'; SET CHARSET 'utf8'");

gibi.
Cevapla
#4
(12-04-2021, Saat: 16:09)Hsavci Adlı Kullanıcıdan Alıntı: Bu tip bir sorunla ilgili olarak connect.php içinde de utf8 ile ilgili bir düzeltme yaptığımı ve sorunun düzeldiğini hatırlıyorum.
$db = new PDO("mysql:dbname=$database;host=$host", "$username", "$password");
$db->exec("SET NAMES 'utf8'; SET CHARSET 'utf8'");

gibi.

Evet utf8 ile ilgili komutlar var connect dosyamda...  Üstelik aynı kodlar PC deki localhostta sorunsuz çalışıyor ancak Hostta bu sorun çıktı. 
Ben sorunun PHP tarafında değil de Delphi tarafında olduğunu düşünüyordum ama bilemiyorum, takıldık kaldık...
Aynı hostta aynı veritabanında farklı uygulamalarım da var onlarda bu sorun yok nedense.
Ne ekersen onu biçersin!  Idea
Cevapla
#5
(12-04-2021, Saat: 16:20)tmrksmt Adlı Kullanıcıdan Alıntı:
(12-04-2021, Saat: 16:09)Hsavci Adlı Kullanıcıdan Alıntı: Bu tip bir sorunla ilgili olarak connect.php içinde de utf8 ile ilgili bir düzeltme yaptığımı ve sorunun düzeldiğini hatırlıyorum.
$db = new PDO("mysql:dbname=$database;host=$host", "$username", "$password");
$db->exec("SET NAMES 'utf8'; SET CHARSET 'utf8'");

gibi.

Evet utf8 ile ilgili komutlar var connect dosyamda...  Üstelik aynı kodlar PC deki localhostta sorunsuz çalışıyor ancak Hostta bu sorun çıktı. 
Ben sorunun PHP tarafında değil de Delphi tarafında olduğunu düşünüyordum ama bilemiyorum, takıldık kaldık...
Aynı hostta aynı veritabanında farklı uygulamalarım da var onlarda bu sorun yok nedense.

bu şekilde bir sorun olmaması gerekiyordu,
belki php kısmında sorun şundan kaynaklanıyor olabilir:

hostingte cpanel kullanıyorsanız, cpanel metin editörü ile düzenleme yaparken üst tarafta charset menüsü var, ordan utf-8 i seçebilirsiniz,

bir de ek seçenek olarak: php kodları notepad ++ a aktarıp, notepad ++ dan utf 8 ayarlayın, encoding menüsü altında convert to utf-8 yapabilirsiniz.
Düzenlediğiniz dosyayı tekrar hostinge upload edip eski dosya ile değiştirin,
Cevapla
#6
(12-04-2021, Saat: 16:31)eroniko Adlı Kullanıcıdan Alıntı:
(12-04-2021, Saat: 16:20)tmrksmt Adlı Kullanıcıdan Alıntı: Evet utf8 ile ilgili komutlar var connect dosyamda...  Üstelik aynı kodlar PC deki localhostta sorunsuz çalışıyor ancak Hostta bu sorun çıktı. 
Ben sorunun PHP tarafında değil de Delphi tarafında olduğunu düşünüyordum ama bilemiyorum, takıldık kaldık...
Aynı hostta aynı veritabanında farklı uygulamalarım da var onlarda bu sorun yok nedense.

bu şekilde bir sorun olmaması gerekiyordu,
belki php kısmında sorun şundan kaynaklanıyor olabilir:

hostingte cpanel kullanıyorsanız, cpanel metin editörü ile düzenleme yaparken üst tarafta charset menüsü var, ordan utf-8 i seçebilirsiniz,

bir de ek seçenek olarak: kodları notepad ++ a aktarıp, notepad ++ dan utf 8 ayarlayın, encoding menüsü altında convert to utf-8 yapabilirsiniz.
Düzenlediğiniz dosyayı tekrar hostinge upload edip eski dosya ile değiştirin,

Sorunun kaynağını tespit ettim. FMX de Windows uygulamada sorun yok, ancak aynı uygulamayı Android ichazda çalıştırıp bir kayıt yapınca db ye de kaydederken Türkçe karakterler bozuluyor. Yani sorun kesinlikle Delphi tarafında ama nedir ona bakıcaz artık.

JSON oluştururken kullandığım UTF8EncodeToShortString ile ilgili bir sıkıntı var sanırım ama bunun yerine Utf8Encode de kullanıp denedim sonuç aynı... Projenin Windows tarafında sorun olmuyor ama APK haline getirip çalıştırdığın zaman DB ye kayıtta TR Karakter sorunu çıkıyor...
Ne ekersen onu biçersin!  Idea
Cevapla
#7
Arkadaşlar biraz araştırdım bu konuda kullanılan Delphi sürümünden kaynaklı sorunlar da olduğunu öğrendim. Umarım böyle bir durum değildir.

FMX-Windows ta hiçbir sorun yok, Edit'ten girilen veriyi Json'a çevirip DB ye düzgün kaydediyor ve düzgün de listeliyor ancak
FMX-Android de TR karakter sorunu yaşıyorum (utf8)

Yani FMX-Android de "UTF8EncodeToShortString" işe yaramıyor gibi gözükmekte!

Örneğin "Üsküdar" yazıyorum db ye bu şekilde kaydediyor;

 Ã¼sküdar

Fikri olan veya bu durumu yaşayan bir arkadaş var mı acaba?
Ne ekersen onu biçersin!  Idea
Cevapla
#8
Arkadaşlar sorunumu çözdüm. İleride bu sorunu yaşayanlara yardımcı olabilmek adına çözümü paylaşıyorum;

Json string oluştururken "UTF8EncodeToShortString" yerine TStringStream.Create(JsonString, TEncoding.UTF8) şeklinde tanımlama yapılırsa sorun ortadan kalkıyor.

İyi çalışmalar.
Ne ekersen onu biçersin!  Idea
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  JSON DataSet Serialize for Unidac Halil Han BADEM 2 498 08-11-2023, Saat: 16:53
Son Yorum: Halil Han BADEM
  Cas Terazi Veri gönderimi Delphi sürüm sorunu KUNTAY 12 4.417 08-11-2023, Saat: 00:06
Son Yorum: berkan
  JSON Verilerini Veritabanına Kaydetmek kajmerantime 6 746 03-11-2023, Saat: 15:05
Son Yorum: kajmerantime
  TCMB Kur Almada Explorer Sertifika Sorunu Adem Kurt 3 621 24-10-2023, Saat: 15:14
Son Yorum: RAD Coder
  program exe icon sorunu cvheneburi 9 2.829 19-10-2023, Saat: 15:04
Son Yorum: harunyl



Konuyu Okuyanlar: 1 Ziyaretçi