R.Reddington

WFN Üye
Konular
627
Mesajlar
627
Çözüm
0
Ticaret Puanı
0
Üyelik
25 Gün
Konum
Kastamonu
Web Sitesi
Var
Alanı
Sosyal Backlink
1/1
Konu sahibi
Türkçe karakterlerin bozuk görünmesi genellikle metnin UTF-8 olarak kaydedilmesi, okunması veya tarayıcıya sunulması aşamalarından birindeki uyumsuzluktan kaynaklanır. Sorunu çözmek için önce bozulmanın dosyada mı, veritabanında mı, yoksa HTTP yanıtında mı başladığını ayırın; ardından ilgili katmanın kodlamasını düzeltip yeni bir test kaydıyla sonucu doğrulayın. Ayarları düzeltmek, daha önce bozulmuş veriyi kendiliğinden onarmaz.

Bozulmanın başladığı yeri bulun​


Önce uygulamanın test ortamında, kayıt veya kişisel bilgi içermeyen şu metni kullanın: İstanbul, ığüşöç. Aynı metni hem bir görünüm dosyasına sabit yazı olarak ekleyin hem de uygulamanın ilgili formundan yeni bir test kaydı olarak kaydedin. Sayfayı yenileyip iki sonucu karşılaştırın.
GözlemÖncelikle bakılacak yer
Sabit yazı ve kayıt da bozukDosya kodlaması ve HTTP yanıtı
Sabit yazı doğru, yeni kayıt bozukFormdan gelen veri ve veritabanı bağlantısı
Yeni kayıt doğru, eski kayıt bozukEski verinin içeriği ve içe aktarma süreci
Bu karşılaştırma kesin teşhis değildir: Örneğin sabit yazının doğru görünmesi, form verisinin veya veritabanı bağlantısının doğru olduğunu kanıtlamaz. Bozuk kayıt yalnızca içe aktarılan verilerde görülüyorsa, kaynak dosyanın gerçek kodlamasını ve içe aktarma sırasında hangi kodlamayla okunduğunu da inceleyin.

Görünüm dosyasını ve HTTP yanıtını düzeltin​


Sabit yazı bozuksa önce metnin bulunduğu görünüm dosyasını editörünüzde açın. Metin editörde de bozuksa doğru karakterleri yeniden yazın; dosyayı UTF-8 olarak kaydedin. Editörde doğru görünmesi tek başına dosyanın ve yanıtın doğru yorumlandığını kanıtlamaz.

Uygulamanın kullandığı yerleşim dosyasında, genellikle app/views/layouts/application.html.erb içinde, head bölümünün başına yakın bir yerde şu bildirimin bulunduğundan emin olun:

HTML:
<meta charset="utf-8">

Ardından tarayıcının geliştirici araçlarındaki ağ incelemesinden sorunlu HTML isteğinin yanıt başlıklarını açın. Content-Type değerinde, örneğin text/html; charset=utf-8 görmelisiniz. Başlık başka bir kodlama bildiriyorsa uygulamadaki yanıt ayarlarını ve arada varsa ters vekil sunucunun başlığı değiştirip değiştirmediğini inceleyin. Yalnızca meta etiketini değiştirmek, çelişkili HTTP başlığını veya önceden bozulmuş metni düzeltmez.

Değişiklikleri kaydedip uygulamayı dağıtım biçiminizin gerektirdiği şekilde yeniden başlatın veya yeniden dağıtın. Sayfayı yenileyerek sabit yazıyı tekrar kontrol edin.

Kayıt ve bağlantı kodlamasını inceleyin​


Sabit yazı doğru, formdan kaydedilen metin bozuksa uygulama dizininde test ortamının Rails konsolunu açın:

Kod:
bin/rails console

Test kaydını ilgili model ve alan adlarıyla sorgulayın. Aşağıdaki örnekte Article, title ve kayıt numarasını kendi uygulamanıza göre değiştirin:

Ruby:
metin = Article.find(1).title
p metin
p metin.encoding
p metin.valid_encoding?

Metin konsolda doğru, tarayıcıda bozuksa yanıtın üretilmesi ve gösterilmesi aşamasını inceleyin. Konsolda da İ gibi yanlış karakterler görünüyorsa bozulma daha önce gerçekleşmiş olabilir; formdan gelen değeri kaydetmeden önce ve kaydettikten sonra test verisiyle karşılaştırın. Konsolun kendi terminal kodlamasının da görüntüyü etkileyebileceğini unutmayın.

valid_encoding? sonucunun true olması, baytların belirtilen kodlamaya uygun olduğunu gösterir; metnin anlamca doğru olduğunu veya daha önce yanlış dönüştürülmediğini kanıtlamaz. force_encoding yalnızca Ruby dizgesinin kodlama etiketini değiştirir, baytları dönüştürmez; bu nedenle rastgele kullanmayın. Kaynak kodlama biliniyorsa dönüşüm için encode kullanın.

Veritabanı bağlantısını da aynı uygulama ortamında kontrol edin. Örneğin PostgreSQL kullanıyorsanız Rails konsolunda şunları çalıştırabilirsiniz:

Ruby:
p ActiveRecord::Base.connection.select_value("SHOW server_encoding")
p ActiveRecord::Base.connection.select_value("SHOW client_encoding")

Bunlar sırasıyla veritabanı ve mevcut istemci bağlantısının kodlamasını gösterir. İkisi de UTF8 ise bu aşama uyumludur; yine de verinin daha önce bozulmadığını kanıtlamaz. Farklı sonuç varsa config/database.yml içindeki ilgili ortamı, bağlantı yapılandırmasını ve veritabanının oluşturulma kodlamasını inceleyin.

MySQL kullanıyorsanız bağlantı karakter kümesinin yanı sıra ilgili tablo ve sütunun karakter kümesini de kontrol edin. MySQL'de utf8mb4 Unicode metin için uygun bir seçenektir; bağlantı ayarı ile mevcut sütunların ayarı ayrı ayrı değerlendirilmelidir. Değişikliği uygulamanın veritabanı bağdaştırıcısının desteklediği yapılandırmayla yapın ve yeni bağlantı açıldıktan sonra test kaydını yeniden deneyin.

Eski bozuk kayıtları güvenle ele alın​


Yeni kayıtlar doğru, eski kayıtlar bozuksa önce yedek alın. Eski veriyi topluca dönüştürmeden önce küçük bir kopyada özgün metni, saklanan değeri ve varsa içe aktarma dosyasını karşılaştırın. Kaynak kodlama ve bozulmanın nasıl oluştuğu belirlenirse uygun dönüşümü kopyada deneyip sonuçları doğrulayın. Karakterler daha önce soru işareti veya yerine koyma karakteriyle kaybolduysa ayar değişikliği onları geri getirmez; özgün kaynaktan veya sağlam yedekten geri yüklemek gerekebilir.

Tanılama için gerçek kullanıcı verilerini sayfaya veya uygulama günlüklerine yazdırmayın. Yalnız test verisi kullanın ve geçici tanılama kodunu işlem bitince kaldırın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic