3 puan yazan GN⁺ 2024-04-28 | 1 yorum | WhatsApp'ta paylaş

PEP 686 - Python 3.15'ten itibaren UTF-8 modu varsayılan olarak ayarlanıyor

  • UTF-8 fiilen standart metin kodlaması haline geliyor
    • Python kaynak dosyalarının varsayılan kodlaması UTF-8
    • JSON, TOML, YAML UTF-8 kullanıyor
    • Visual Studio Code, Windows Not Defteri gibi çoğu metin editörü varsayılan olarak UTF-8 kullanıyor
    • Çoğu web sitesi ve internetteki metin verileri UTF-8 kullanıyor
    • Node.js, Go, Rust, Java gibi diğer birçok popüler programlama dili de varsayılan olarak UTF-8 kullanıyor
  • Varsayılan kodlamanın UTF-8'e değiştirilmesi, Python'ın diğer dillerle birlikte çalışmasını kolaylaştırıyor
  • Unix kullanan birçok Python geliştiricisi, varsayılan kodlamanın platforma göre değiştiği gerçeğini unutuyor
    • UTF-8 ile kodlanmış metin dosyaları (JSON, TOML, Markdown, Python kaynak dosyaları vb.) okunurken encoding="utf-8" belirtilmiyor
    • Tutarsız varsayılan kodlama nedeniyle birçok hata ortaya çıkıyor

PEP 686'nın başlıca değişiklikleri

  • Python 3.15'ten itibaren UTF-8 modu varsayılan olarak etkin olacak
    • Kullanıcılar yine de PYTHONUTF8=0 veya -X utf8=0 ayarlayarak UTF-8 modunu devre dışı bırakabilir
  • locale.getencoding() eklendi
    • UTF-8 modundan bağımsız olarak yerel ayar kodlamasını almak için API
    • warn_default_encoding seçeneği belirtilirse locale.getpreferredencoding(), open() ile aynı şekilde EncodingWarning üretir (bkz. PEP 597)
  • encoding="locale" seçeneği düzeltildi
    • TextIOWrapper, encoding="locale" belirtildiğinde UTF-8 modunda da yerel ayar kodlamasını kullanmalı

Geriye dönük uyumluluk

  • Çoğu Unix sistemi UTF-8 yerel ayarını kullanıyor ve Python yerel ayar C veya POSIX olduğunda UTF-8 modunu etkinleştirdiği için bu değişiklik esas olarak Windows kullanıcılarını etkileyecek
  • Python programı varsayılan kodlamaya bağımlıysa bu değişiklik UnicodeError, karakter bozulması veya sessiz veri bozulmasına yol açabilir
  • Geriye dönük uyumluluk sorunlarını çözmek için yönergeler:
    1. UTF-8 modunu devre dışı bırakın
    2. UTF-8 modunun etkilediği tüm yerleri bulmak için EncodingWarning (PEP 597) kullanın
      • encoding seçeneği atlanmışsa encoding="utf-8" veya encoding="locale" kullanmayı değerlendirin
      • locale.getpreferredencoding() kullanılıyorsa "utf-8" veya locale.getencoding() kullanmayı değerlendirin
    3. Uygulamanızı UTF-8 modunda test edin

GN⁺ görüşü

  • Bu PEP, Python'ın varsayılan kodlamasını UTF-8'de birleştirerek diğer diller ve sistemlerle birlikte çalışabilirliği artırmayı hedefliyor. Bu, Python'ın küresel geliştirme ortamlarında daha sorunsuz kullanılmasına yardımcı olacaktır
  • Ancak bu değişiklik mevcut Python programlarının geriye dönük uyumluluğunu etkileyebilir. Özellikle Windows ortamında çalışan programlar için dikkat gerekiyor
  • Geliştiriciler, etkilenen bölümleri belirlemek için EncodingWarning'den yararlanmalı ve encoding seçeneğini açıkça belirtmek gibi yöntemlerle hazırlık yapmalı
  • Uzun vadede bu değişikliğin Python ekosistemi üzerinde olumlu etki yaratması bekleniyor. Ancak kısa vadede bazı projelerde geçiş maliyeti doğurabilir
  • Geliştiriciler Python 3.15'e yükseltmeyi planlarken bu değişikliği dikkate almalı ve gerekirse geriye dönük uyumluluk için uygun önlemleri almalı

1 yorum

 
GN⁺ 2024-04-28
Hacker News görüşleri
  • Python'ın varsayılan metin dosyası kodlamasının platforma göre farklı olması uzun zamandır bir sorundu
  • Dosya sistemi kodlaması sorunu ayrı bir konu ve bu değişiklikte ele alınmıyor
  • Sistemin varsayılanına güvenmek iyi değil. Çünkü varsayılan değer varsayımınızdan farklı olabilir
  • Geçmişte Ubuntu ve init.d betiklerinde sorun vardı. Root olarak çalışan Java başlatma betikleri, normal kullanıcıdan farklı bir kodlama kullandığı için sorun çıkıyordu
  • Günümüzde daha az sorun olsa da bunu işletim sistemine bırakmaktan kaçınmak gerekir. UTF-8 dışındaki bir kodlamanın kullanılması büyük ihtimalle kasıtsızdır
  • Açıkça belirtmeden işletim sistemi ayarlarına güvenmek iyi değil
  • Bu değişiklik doğru yönde bir adım. Bozulan kodu basitçe düzeltmek daha iyi
  • İçerik bozulması hatası potansiyeliyle bırakmaktan daha iyi olduğunu düşünüyorum

Son birkaç on yılda giderek daha doğru hale gelen deneyim kuralı: "charset" ayarı UTF-8 değilse, yanlıştır

  • Python 2 karakter kümesinden bağımsız olduğu için her zaman iyi çalışıyordu, ancak Python 3'teki iyileştirmeler iyileştirmeden fazlasıydı

  • Python 3 betikleriyle Python 2 betiklerini ayırt etme yöntemi:

    • "utf-8" dizesi varsa Python 3
    • Yalnızca C.UTF-8 locale'inde çalışıyorsa Python 3
  • Bu değişiklik memnuniyet verici ve Python 3'ü "iyileştirecek" gibi görünüyor

  • Bunun Python 3'ten beri varsayılan olduğunu sanıyordum

Node.js, Go, Rust ve Java dahil birçok popüler dil varsayılan olarak UTF-8 kullanıyor

  • Java'nın UTF-16'dan UTF-8'e geçtiğini bilmiyordum

  • CPython'ın dahili kodlamasının UTF-8 olup olmadığını bilmiyorum

  • Python dizeleri indekslenebilir, ancak rastgele erişim nadirdir; bu yüzden gerektiğinde tembel indeksleme yapmak daha iyi olabilir

  • Yalnızca birer karakter ileri geri gitmek gerekiyorsa indekse gerek yok

  • Bu yüzden dahili olarak UTF-8 gösterimi mümkün görünüyor

  • Neden utf-8-sig değil? BOM'u isteğe bağlı olarak işleyebildiği için kullanışlı

  • UTF-8 ile ilgili olarak, Linux framebuffer uzun zaman önce düzgün UTF-8 desteğine sahip olmalıydı

  • GNU Hurd, 2007 civarından beri UTF-8 destekleyen daha iyi bir 'terminal console'a sahipti

  • Böyle bir değişikliğin ancak 2024'te gelmesi şaşırtıcı

  • Güzel bir değişiklik. Şimdi sadece JS'nin UTF-8'e geçmesi kaldı, ama 1995'te yazılmış kodlarla uyumluluk gerektiği için iyileştirme zor

Birçok Unix Python geliştiricisi varsayılan kodlamanın platforma göre değiştiğini unutuyor ve UTF-8 metin dosyalarını okurken encoding="utf-8" belirtmiyor

  • "Unutuyorlar" demekten çok bunun yeterince farkında olmadıklarını düşünüyorum
  • Python'ın açıkça istenmedikçe her yerde yalnızca UTF-8 kullanacağını sanıyordum