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:
- UTF-8 modunu devre dışı bırakın
- 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
- 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
Hacker News görüşleri
init.dbetiklerinde sorun vardı. Root olarak çalışan Java başlatma betikleri, normal kullanıcıdan farklı bir kodlama kullandığı için sorun çıkıyorduPython 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 3C.UTF-8locale'inde çalışıyorsa Python 3Bu 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
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-sigdeğ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