PEP 686 - Menetapkan mode UTF-8 sebagai nilai default mulai Python 3.15
- UTF-8 semakin menjadi encoding teks standar de facto
- Encoding default untuk file sumber Python adalah UTF-8
- JSON, TOML, YAML menggunakan UTF-8
- Sebagian besar editor teks seperti Visual Studio Code dan Windows Notepad secara default menggunakan UTF-8
- Sebagian besar situs web dan data teks di internet menggunakan UTF-8
- Banyak bahasa pemrograman populer lain seperti Node.js, Go, Rust, dan Java juga secara default menggunakan UTF-8
- Mengubah encoding default ke UTF-8 memudahkan Python untuk berinteroperasi dengan bahasa lain
- Banyak pengembang Python pengguna Unix lupa bahwa encoding default berbeda-beda tergantung platform
- Saat membaca file teks yang di-encode dengan UTF-8 (JSON, TOML, Markdown, file sumber Python, dll.), mereka tidak menentukan
encoding="utf-8"
- Encoding default yang tidak konsisten menyebabkan banyak bug
Perubahan utama di PEP 686
- Mulai Python 3.15, mode UTF-8 akan diaktifkan secara default
- Pengguna tetap bisa menonaktifkan mode UTF-8 dengan mengatur
PYTHONUTF8=0 atau -X utf8=0
- Penambahan
locale.getencoding()
- API untuk mendapatkan encoding locale terlepas dari mode UTF-8
- Jika opsi
warn_default_encoding ditentukan, locale.getpreferredencoding() akan memunculkan EncodingWarning seperti halnya open() (lihat PEP 597)
- Perubahan pada opsi
encoding="locale"
TextIOWrapper harus menggunakan encoding locale meskipun dalam mode UTF-8 jika encoding="locale" ditentukan
Kompatibilitas mundur
- Sebagian besar sistem Unix menggunakan locale UTF-8 dan Python mengaktifkan mode UTF-8 ketika locale adalah C atau POSIX, sehingga perubahan ini terutama berdampak pada pengguna Windows
- Jika program Python bergantung pada encoding default, perubahan ini dapat menyebabkan
UnicodeError, mojibake, atau kerusakan data diam-diam
- Panduan untuk mengatasi masalah kompatibilitas mundur:
- Nonaktifkan mode UTF-8
- Gunakan
EncodingWarning (PEP 597) untuk menemukan semua lokasi yang terdampak oleh mode UTF-8
- Jika opsi
encoding dihilangkan, pertimbangkan menggunakan encoding="utf-8" atau encoding="locale"
- Jika
locale.getpreferredencoding() digunakan, pertimbangkan menggunakan "utf-8" atau locale.getencoding()
- Uji aplikasi dengan mode UTF-8
Pendapat GN⁺
- PEP ini bertujuan menyatukan encoding default Python ke UTF-8 untuk meningkatkan interoperabilitas dengan bahasa dan sistem lain. Ini akan membantu Python digunakan lebih mulus di lingkungan pengembangan global
- Namun, perubahan ini dapat memengaruhi kompatibilitas mundur program Python yang sudah ada. Khususnya untuk program yang berjalan di lingkungan Windows, perlu perhatian lebih
- Pengembang perlu memanfaatkan
EncodingWarning untuk mengidentifikasi bagian yang terdampak, dan menanganinya dengan cara seperti secara eksplisit menentukan opsi encoding
- Dalam jangka panjang, perubahan ini diperkirakan akan membawa dampak positif bagi ekosistem Python. Namun dalam jangka pendek, beberapa proyek mungkin akan menanggung biaya migrasi
- Pengembang perlu mempertimbangkan perubahan ini saat merencanakan upgrade ke Python 3.15, dan jika perlu mengambil langkah yang tepat untuk menjaga kompatibilitas mundur
1 komentar
Komentar Hacker News
init.d. Skrip peluncur Java yang dijalankan sebagai root menggunakan encoding berbeda dari pengguna biasa sehingga menimbulkan masalahPython 2 tidak terlalu terikat pada charset sehingga selalu bekerja dengan baik, tetapi perbaikan di Python 3 terasa lebih dari sekadar perbaikan
Cara membedakan skrip Python 3 dan Python 2:
"utf-8", maka itu Python 3C.UTF-8, maka itu Python 3Perubahan ini layak disambut dan tampaknya akan semakin "memperbaiki" Python 3
Saya kira ini sudah menjadi nilai bawaan sejak Python 3
Saya tidak tahu bahwa Java telah beralih dari UTF-16 ke UTF-8
Saya tidak tahu apakah encoding internal CPython adalah UTF-8
String Python bisa diindeks, tetapi akses acak jarang diperlukan, jadi sepertinya lebih baik melakukan pengindeksan tertunda saat dibutuhkan
Jika hanya perlu bergerak maju atau mundur satu langkah, indeks tidak diperlukan
Karena itu, tampaknya representasi internal UTF-8 dimungkinkan
Mengapa bukan
utf-8-sig? Itu berguna karena bisa menangani BOM secara opsionalTerkait UTF-8, framebuffer Linux seharusnya sudah sejak lama memiliki dukungan UTF-8 yang benar
GNU Hurd sudah memiliki 'terminal console' yang lebih baik dengan dukungan UTF-8 sejak sekitar 2007
Sulit dipercaya perubahan seperti ini baru datang pada 2024
Perubahan yang bagus. Sekarang tinggal JS yang harus beralih ke UTF-8, tetapi perbaikannya sulit karena harus tetap kompatibel dengan kode yang ditulis pada 1995