Seperti yang dikatakan orang lain, # coding:
menentukan pengkodean tempat file sumber disimpan. Berikut adalah beberapa contoh untuk menggambarkan hal ini:
File disimpan pada disk sebagai cp437 (pengkodean konsol saya), tetapi tidak ada pengkodean yang dinyatakan
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Keluaran:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
Output file dengan # coding: cp437
menambahkan:
über '\x81ber'
über u'\xfcber'
Awalnya, Python tidak mengetahui pengkodeannya dan mengeluhkan karakter non-ASCII. Setelah mengetahui pengkodeannya, string byte mendapatkan byte yang sebenarnya ada di disk. Untuk string Unicode, Python membaca \ x81, mengetahui bahwa di cp437 itu adalah ü , dan mendekodekannya menjadi titik kode Unicode untuk ü yaitu U + 00FC. Ketika string byte dicetak, Python mengirim nilai hex 81
ke konsol secara langsung. Ketika string Unicode dicetak, Python dengan benar mendeteksi pengkodean konsol saya sebagai cp437 dan menerjemahkan Unicode ü ke nilai cp437 untuk ü .
Inilah yang terjadi dengan file yang dideklarasikan dan disimpan dalam UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
Dalam UTF-8, ü dikodekan sebagai hex byte C3 BC
, sehingga string byte berisi byte tersebut, tetapi string Unicode identik dengan contoh pertama. Python membaca dua byte dan mendekodekannya dengan benar. Python salah mencetak string byte, karena mengirim dua byte UTF-8 yang mewakili ü langsung ke konsol cp437 saya.
Di sini file tersebut dinyatakan sebagai cp437, tetapi disimpan dalam UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
String byte masih mendapatkan byte pada disk (UTF-8 hex byte C3 BC
), tetapi menafsirkannya sebagai dua karakter cp437 alih-alih satu karakter yang dikodekan UTF-8. Kedua karakter yang diterjemahkan ke poin kode Unicode, dan semuanya dicetak dengan tidak benar.
# coding: utf8
cukup baik, tidak perlu-*-