Saya memiliki server soket yang seharusnya menerima karakter valid UTF-8 dari klien.
Masalahnya adalah beberapa klien (terutama peretas) mengirimkan semua jenis data yang salah di atasnya.
Saya dapat dengan mudah membedakan klien asli, tetapi saya masuk ke file semua data yang dikirim sehingga saya bisa menganalisisnya nanti.
Terkadang saya mendapatkan karakter seperti ini œ
yang menyebabkan UnicodeDecodeError
kesalahan.
Saya harus bisa membuat string UTF-8 dengan atau tanpa karakter tersebut.
Memperbarui:
Untuk kasus khusus saya, layanan socket adalah MTA dan karenanya saya hanya berharap untuk menerima perintah ASCII seperti:
EHLO example.com
MAIL FROM: <john.doe@example.com>
...
Saya mencatat semua ini di JSON.
Kemudian beberapa orang di luar sana tanpa niat baik memutuskan untuk menjual semua jenis sampah.
Itulah sebabnya untuk kasus khusus saya, sangat oke untuk menghapus karakter non ASCII.
sumber
Jawaban:
http://docs.python.org/howto/unicode.html#the-unicode-type
atau
Catatan: Ini akan menghapus (mengabaikan) karakter yang dimaksud mengembalikan string tanpa mereka.
Bagi saya ini adalah kasus yang ideal karena saya menggunakannya sebagai perlindungan terhadap input non-ASCII yang tidak diizinkan oleh aplikasi saya.
Atau: Gunakan metode terbuka dari
codecs
modul untuk membaca dalam file:sumber
str.decode('cp1252').encode('utf-8')
'\xc0msterdam'
yang berubah menjadiu'\ufffdmsterdam'
gantiopen(file_name, "rb")
dan kemudian menerapkan pendekatan Ben dari komentar di atasMengubah mesin dari C ke Python melakukan trik untuk saya.
Engine adalah C:
Engine adalah Python:
Tidak ada kesalahan untuk saya.
sumber
csv
file besar . Ini bisa membawa Anda keOutOfMemory
kesalahan atau restart kernel notebook Anda secara otomatis. Anda harus mengaturencoding
kasus ini.Jenis masalah ini muncul bagi saya sekarang karena saya sudah pindah ke Python 3. Saya tidak tahu Python 2 hanya menggulung masalah dengan encoding file.
Saya menemukan penjelasan yang bagus tentang perbedaan ini dan bagaimana menemukan solusi setelah tidak ada yang berhasil bagi saya.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
Singkatnya, untuk membuat Python 3 berperilaku semirip mungkin dengan Python 2 gunakan:
Namun, baca artikelnya, tidak ada satu ukuran cocok untuk semua solusi.
sumber
sumber
used by default in the legacy components of Microsoft Windows in English and some other Western languages
Saya memiliki masalah yang sama dengan
UnicodeDecodeError
dan saya menyelesaikannya dengan baris ini. Tidak tahu apakah itu cara terbaik tetapi itu berhasil untuk saya.sumber
yang pertama, Menggunakan get_encoding_type untuk mendapatkan tipe file encode:
yang kedua, buka file dengan tipe:
sumber
Hanya dalam kasus seseorang memiliki masalah yang sama. Saya menggunakan vim dengan YouCompleteMe , gagal memulai ycmd dengan pesan kesalahan ini, yang saya lakukan adalah:,
export LC_CTYPE="en_US.UTF-8"
masalahnya hilang.sumber
export LC_CTYPE="en_US.UTF-8"
?Apa yang dapat Anda lakukan jika Anda perlu membuat perubahan ke file, tetapi tidak tahu penyandian file? Jika Anda tahu penyandiannya kompatibel dengan ASCII dan hanya ingin memeriksa atau memodifikasi bagian ASCII, Anda dapat membuka file dengan penangan kesalahan surrogateescape:
sumber
Saya telah memecahkan masalah ini hanya dengan menambahkan
sumber