Saya menarik data dari Google doc, memprosesnya, dan menulisnya ke file (yang akhirnya akan saya tempelkan ke halaman Wordpress).
Ini memiliki beberapa simbol non-ASCII. Bagaimana saya bisa mengonversi ini dengan aman ke simbol yang dapat digunakan dalam sumber HTML?
Saat ini saya mengonversi semuanya ke Unicode di jalan, menggabungkan semuanya bersama dalam string Python, lalu melakukan:
import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))
Ada kesalahan penyandian pada baris terakhir:
UnicodeDecodeError: 'ascii' codec tidak dapat mendekode byte 0xa0 di posisi 12286: ordinal tidak dalam jangkauan (128)
Solusi parsial:
Python ini berjalan tanpa kesalahan:
row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))
Tetapi jika saya membuka file teks yang sebenarnya, saya melihat banyak simbol seperti:
Qur’an
Mungkin saya perlu menulis sesuatu selain file teks?
Jawaban:
Menangani secara eksklusif dengan objek unicode sebanyak mungkin dengan mendekodekan hal-hal ke objek unicode ketika Anda pertama kali mendapatkannya dan menyandikannya saat diperlukan di jalan keluar.
Jika string Anda benar-benar objek unicode, Anda harus mengonversinya menjadi objek string unicode-encode sebelum menulisnya ke file:
Saat Anda membaca file itu lagi, Anda akan mendapatkan string yang disandikan unicode yang bisa Anda dekode ke objek unicode:
sumber
Dalam Python 2.6+, Anda bisa menggunakan
io.open()
yang default ( builtinopen()
) di Python 3:Mungkin lebih nyaman jika Anda perlu menulis teks secara bertahap (Anda tidak perlu menelepon
unicode_text.encode(character_encoding)
berkali-kali). Tidak seperticodecs
modul,io
modul memiliki dukungan baris baru universal yang tepat.sumber
Penanganan string Unicode sudah terstandarisasi dalam Python 3.
Anda hanya perlu membuka file dalam utf-8
(Konversi 32-bit Unicode ke variabel-byte-panjang utf-8 secara otomatis dilakukan dari memori ke file.)
sumber
File dibuka oleh
codecs.open
adalah file yang mengambilunicode
data, mengkodekannyaiso-8859-1
dan menulisnya ke file. Namun, apa yang Anda coba tulis bukanlahunicode
; Anda mengambilunicode
dan menyandikannya dalamiso-8859-1
diri Anda . Itulah yang dilakukan olehunicode.encode
metode ini, dan hasil dari pengkodean string unicode adalah bytestring (str
tipe.)Anda harus menggunakan normal
open()
dan menyandikan unicode sendiri, atau (biasanya ide yang lebih baik) menggunakancodecs.open()
dan tidak menyandikan data sendiri.sumber
Pendahuluan: apakah pemirsa Anda akan berfungsi?
Pastikan pemirsa / editor / terminal Anda (namun Anda berinteraksi dengan file yang dikodekan utf-8 Anda) dapat membaca file tersebut. Ini sering menjadi masalah pada Windows , misalnya, Notepad.
Dalam Python 2, gunakan
open
dariio
modul (ini sama dengan builtinopen
di Python 3):Praktik terbaik, secara umum, digunakan
UTF-8
untuk menulis ke file (kita bahkan tidak perlu khawatir tentang byte-order dengan utf-8).utf-8 adalah pengkodean yang paling modern dan dapat digunakan secara universal - ini bekerja di semua browser web, sebagian besar editor teks (lihat pengaturan Anda jika Anda memiliki masalah) dan sebagian besar terminal / shell.
Pada Windows, Anda dapat mencoba
utf-16le
jika Anda terbatas untuk melihat output di Notepad (atau penampil terbatas lainnya).Dan buka saja dengan manajer konteks dan tulis karakter unicode Anda:
Contoh menggunakan banyak karakter Unicode
Berikut adalah contoh yang mencoba untuk memetakan setiap karakter yang mungkin hingga tiga bit lebar (4 adalah maks, tapi itu akan menjadi agak jauh) dari representasi digital (dalam bilangan bulat) ke output cetak yang disandikan, bersama dengan namanya, jika mungkin (taruh ini di file bernama
uni.py
):Ini akan berjalan dalam urutan sekitar satu menit, dan Anda dapat melihat file data, dan jika penampil file Anda dapat menampilkan unicode, Anda akan melihatnya. Informasi tentang kategori dapat ditemukan di sini . Berdasarkan jumlah, kami mungkin dapat meningkatkan hasil dengan mengecualikan kategori Cn dan Co, yang tidak memiliki simbol yang terkait dengannya.
Ini akan menampilkan pemetaan heksadesimal, kategori , simbol (kecuali jika tidak bisa mendapatkan nama, jadi mungkin karakter kontrol), dan nama simbol. misalnya
Saya merekomendasikan
less
Unix atau Cygwin (jangan cetak / cat seluruh file ke output Anda):misalnya akan menampilkan mirip dengan baris berikut yang saya sampel darinya menggunakan Python 2 (unicode 5.2):
Python 3.5 saya dari Anaconda memiliki unicode 8.0, saya kira kebanyakan 3 akan.
sumber
Cara mencetak karakter unicode ke file:
Simpan ini ke file: foo.py:
Jalankan dan pipa output ke file:
Buka tmp.txt dan lihat ke dalam, Anda melihat ini:
Dengan demikian Anda telah menyimpan unicode e dengan tanda kebingungan pada file.
sumber
Kesalahan itu muncul ketika Anda mencoba untuk menyandikan string non-unicode: ia mencoba untuk men-decode, dengan asumsi itu dalam ASCII biasa. Ada dua kemungkinan:
f.write(all_html)
sebagai gantinya..encode(...)
, pertama kali mencoba untuk memecahkan kode itu.sumber
Dalam hal penulisan di python3
Dalam hal penulisan di python2:
Untuk menghindari kesalahan ini, Anda harus menyandikannya ke byte menggunakan codec "utf-8" seperti ini:
dan mendekode data saat membaca menggunakan codec "utf-8":
Dan juga jika Anda mencoba menjalankan print pada string ini maka secara otomatis akan mendekode menggunakan codec "utf-8" seperti ini
sumber