Saya sangat bingung dengan codecs.open function
. Ketika saya melakukannya:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
Ini memberi saya kesalahan
UnicodeDecodeError: 'ascii' codec tidak dapat mendekode byte 0xef di posisi 0: ordinal tidak dalam jangkauan (128)
Jika aku melakukan:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
Ini bekerja dengan baik.
Pertanyaannya adalah mengapa metode pertama gagal? Dan bagaimana cara memasukkan bom?
Jika metode kedua adalah cara yang benar untuk melakukannya, apa gunanya menggunakan codecs.open(filename, "w", "utf-8")
?
python
utf-8
byte-order-mark
John Jiang
sumber
sumber
Jawaban:
Saya percaya masalahnya adalah bahwa itu
codecs.BOM_UTF8
adalah string byte, bukan string Unicode. Saya menduga file handler sedang mencoba menebak apa yang sebenarnya Anda maksudkan berdasarkan "Saya seharusnya menulis Unicode sebagai teks yang dikodekan UTF-8, tetapi Anda telah memberi saya string byte!"Cobalah menulis string Unicode untuk tanda urutan byte (yaitu Unicode U + FEFF) secara langsung, sehingga file tersebut hanya mengkodekannya sebagai UTF-8:
(Tampaknya memberi jawaban yang benar - file dengan byte EF BB BF.)
EDIT: Saran S. Lott untuk menggunakan "utf-8-sig" sebagai pengkodean adalah yang lebih baik daripada secara eksplisit menulis BOM sendiri, tetapi saya akan meninggalkan jawaban ini di sini karena menjelaskan apa yang salah sebelumnya.
sumber
codecs.open
bukan hanyaopen
Baca yang berikut: http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig
Melakukan hal ini
File yang dihasilkan adalah UTF-8 dengan BOM yang diharapkan.
sumber
temp.close()
?open
.@ S-Lott memberikan prosedur yang tepat, tetapi memperluas masalah Unicode , juru bahasa Python dapat memberikan lebih banyak wawasan.
Jon Skeet benar (tidak biasa) tentang
codecs
modul - ini berisi string byte:Memilih nit lain, yang
BOM
memiliki nama Unicode standar , dan itu dapat dimasukkan sebagai:Ini juga dapat diakses melalui
unicodedata
:sumber
Saya menggunakan perintah file * nix untuk mengonversi file charset yang tidak dikenal dalam file utf-8
sumber
# coding: utf8
alih-alih# -*- coding: utf-8 -*-
yang jauh lebih mudah diingat.