- Konu sahibi
- #1
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.
Önce uygulamanın test ortamında, kayıt veya kişisel bilgi içermeyen şu metni kullanın:
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.
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
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.
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.
Sabit yazı doğru, formdan kaydedilen metin bozuksa uygulama dizininde test ortamının Rails konsolunu açın:
Test kaydını ilgili model ve alan adlarıyla sorgulayın. Aşağıdaki örnekte
Metin konsolda doğru, tarayıcıda bozuksa yanıtın üretilmesi ve gösterilmesi aşamasını inceleyin. Konsolda da
Veritabanı bağlantısını da aynı uygulama ortamında kontrol edin. Örneğin PostgreSQL kullanıyorsanız Rails konsolunda şunları çalıştırabilirsiniz:
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
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
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.
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 bozuk | Dosya kodlaması ve HTTP yanıtı |
| Sabit yazı doğru, yeni kayıt bozuk | Formdan gelen veri ve veritabanı bağlantısı |
| Yeni kayıt doğru, eski kayıt bozuk | Eski verinin içeriği ve içe aktarma süreci |
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.