Saya masih belajar python dan saya ragu:
Di python 2.6.x saya biasanya mendeklarasikan pengkodean di header file seperti ini (seperti di PEP 0263 )
# -*- coding: utf-8 -*-
Setelah itu, string saya ditulis seperti biasa:
a = "A normal string without declared Unicode"
Tetapi setiap kali saya melihat kode proyek python, pengkodeannya tidak dideklarasikan di header. Sebaliknya, itu dideklarasikan di setiap string seperti ini:
a = u"A string with declared Unicode"
Apa bedanya? Apa tujuannya ini? Saya tahu Python 2.6.x menetapkan pengkodean ASCII secara default, tetapi dapat diganti dengan deklarasi header, jadi apa gunanya deklarasi per string?
Tambahan: Sepertinya saya telah mencampur pengkodean file dengan pengkodean string. Terima kasih telah menjelaskannya :)
# coding: utf8
cukup baik, tidak perlu-*-
# coding: utf-8
.#coding=utf-8
. python.org/dev/peps/pep-0263Jawaban:
Itu adalah dua hal yang berbeda, seperti yang disebutkan orang lain.
Saat Anda menentukan
# -*- coding: utf-8 -*-
, Anda memberi tahu Python bahwa file sumber yang Anda simpan adalahutf-8
. Default untuk Python 2 adalah ASCII (untuk Python 3 ituutf-8
). Ini hanya memengaruhi cara penerjemah membaca karakter dalam file.Secara umum, mungkin bukan ide terbaik untuk menyematkan karakter unicode tinggi ke dalam file Anda apa pun pengkodeannya; Anda dapat menggunakan pelolosan unicode string, yang berfungsi di salah satu enkode.
Saat Anda mendeklarasikan string dengan
u
in front , likeu'This is a string'
, ini memberi tahu compiler Python bahwa string tersebut adalah Unicode, bukan byte. Hal ini sebagian besar ditangani secara transparan oleh penerjemah; perbedaan yang paling jelas adalah sekarang Anda dapat menyematkan karakter unicode dalam string (yangu'\u2665'
sekarang legal). Anda dapat menggunakannyafrom __future__ import unicode_literals
untuk menjadikannya default.Ini hanya berlaku untuk Python 2; di Python 3 defaultnya adalah Unicode, dan Anda perlu menentukan a
b
di depan (sepertib'These are bytes'
, untuk menyatakan urutan byte).sumber
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
Keluaran:
Output file dengan
# coding: cp437
menambahkan: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:
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:
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.sumber
Itu tidak mengatur format string; itu mengatur format file. Bahkan dengan header itu,
"hello"
adalah string byte, bukan string Unicode. Untuk membuatnya menjadi Unicode, Anda harus menggunakannya diu"hello"
mana saja. Header hanyalah petunjuk tentang format apa yang akan digunakan saat membaca.py
file.sumber
Definisi header adalah untuk menentukan pengkodean kode itu sendiri, bukan string yang dihasilkan saat runtime.
menempatkan karakter non-ascii seperti ۲ di skrip python tanpa definisi header utf-8 akan memunculkan peringatan
sumber
Saya membuat modul berikut yang disebut unicoder untuk dapat melakukan transformasi pada variabel:
Kemudian dalam program Anda, Anda dapat melakukan hal berikut:
sumber