3 poin oleh GN⁺ 2024-04-28 | 1 komentar | Bagikan ke WhatsApp

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:
    1. Nonaktifkan mode UTF-8
    2. 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()
    3. 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

 
GN⁺ 2024-04-28
Komentar Hacker News
  • Fakta bahwa encoding file teks default Python berbeda-beda tergantung platform sudah lama menjadi masalah
  • Masalah encoding sistem berkas adalah hal terpisah, dan tidak dibahas dalam perubahan kali ini
  • Bergantung pada nilai bawaan sistem bukanlah hal yang baik, karena bisa berbeda dari asumsi
  • Dulu pernah ada masalah di Ubuntu dan skrip init.d. Skrip peluncur Java yang dijalankan sebagai root menggunakan encoding berbeda dari pengguna biasa sehingga menimbulkan masalah
  • Sekarang ini dampaknya lebih kecil, tetapi hal seperti ini sebaiknya tidak diserahkan ke OS. Penggunaan encoding selain UTF-8 kemungkinan besar tidak disengaja
  • Tidak baik jika tidak menentukannya secara eksplisit lalu bergantung pada pengaturan OS
  • Perubahan ini adalah langkah ke arah yang baik. Kode yang rusak sebaiknya cukup diperbaiki dengan sederhana
  • Ini lebih baik daripada membiarkannya dalam keadaan yang berpotensi menimbulkan bug perusakan isi

Aturan praktis yang dalam beberapa dekade terakhir makin sering terbukti benar: jika pengaturan "charset" bukan UTF-8, maka itu salah

  • Python 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:

    • jika ada string "utf-8", maka itu Python 3
    • jika hanya berjalan di locale C.UTF-8, maka itu Python 3
  • Perubahan ini layak disambut dan tampaknya akan semakin "memperbaiki" Python 3

  • Saya kira ini sudah menjadi nilai bawaan sejak Python 3

Banyak bahasa populer, termasuk Node.js, Go, Rust, dan Java, menggunakan UTF-8 secara default

  • 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 opsional

  • Terkait 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

Banyak pengembang Python di Unix lupa bahwa encoding default berbeda-beda menurut platform, sehingga saat membaca file teks UTF-8 mereka tidak menuliskan encoding="utf-8"

  • Daripada "lupa", sepertinya mereka memang tidak benar-benar menyadarinya
  • Saya mengira Python akan menggunakan UTF-8 di mana-mana kecuali diminta secara eksplisit untuk tidak melakukannya