Saya mengalami beberapa masalah saat mencoba mengenkode string ke UTF-8. Saya sudah mencoba banyak hal, termasuk menggunakan string.encode('utf-8')
dan unicode(string)
, tetapi saya mendapatkan kesalahan:
UnicodeDecodeError: 'ascii' codec tidak dapat mendekode byte 0xef di posisi 1: ordinal tidak dalam jangkauan (128)
Ini string saya:
(。・ω・。)ノ
Saya tidak melihat apa yang salah, ada ide?
Sunting: Masalahnya adalah bahwa mencetak string seperti itu tidak ditampilkan dengan benar. Juga, kesalahan ini ketika saya mencoba mengubahnya:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
Jawaban:
Ini terkait dengan pengkodean terminal Anda yang tidak disetel ke UTF-8. Ini terminal saya
Di terminal saya, contohnya bekerja dengan yang di atas, tetapi jika saya menyingkirkan
LANG
pengaturannya maka itu tidak akan berhasilLihat dokumen untuk varian linux Anda untuk mengetahui bagaimana membuat perubahan ini permanen.
sumber
sudo apt-get install language-pack-de
atausudo locale-gen de_DE.UTF-8
(untuk bahasa Jerman).LC_ALL
, dan nilai paling sederhana yang akan memperbaikinya adalahC.UTF-8
mencoba:
edit:
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')
memberiu'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, yang benar.jadi masalah Anda pasti ada di beberapa tempat lain, mungkin jika Anda mencoba melakukan sesuatu dengannya seandainya ada konversi implisit yang terjadi (bisa mencetak, menulis ke aliran ...)
untuk mengatakan lebih banyak, kita perlu melihat beberapa kode.
sumber
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
.string
dienkodekan utf8. jika Anda mencetaknya, itu hanya mengirim byte ke aliran keluaran, dan jika terminal Anda tidak menafsirkannya sebagai utf8 Anda berakhir dengan sampah. dengandecode
Anda mengubahnya menjadi unicode, maka Anda dapatencode
mengubahnya lagi menjadi pengkodean yang dipahami terminal Anda.+1 saya untuk komentar mata di https://stackoverflow.com/a/10561979/1346705 dan untuk demonstrasi Nick Craig-Wood. Anda telah memecahkan kode string dengan benar. Masalahnya ada pada
print
perintah saat ia mengubah string Unicode menjadi encoding konsol, dan konsol tidak mampu menampilkan string tersebut. Cobalah untuk menulis string ke dalam file dan lihat hasilnya menggunakan beberapa editor yang mendukung Unicode:Kemudian kamu akan lihat
(。・ω・。)ノ
.sumber
Jika Anda bekerja pada host jarak jauh , lihat di PC lokal
/etc/ssh/ssh_config
Anda .Jika file ini berisi baris:
beri komentar dengan menambahkan
#
di bagian depan baris. Mungkin bisa membantu.Dengan baris ini,
ssh
mengirimkan variabel lingkungan terkait bahasa dari PC Anda ke host jarak jauh . Itu menyebabkan banyak masalah.sumber
Coba setel pengkodean default sistem seperti
utf-8
di awal skrip, sehingga semua string dikodekan menggunakan itu.sumber
Tidak masalah menggunakan kode di bawah ini di bagian atas skrip Anda seperti yang disarankan Andrei Krasutski .
Tetapi saya akan menyarankan Anda untuk juga menambahkan
# -*- coding: utf-8 -*
baris di bagian paling atas skrip.Mengabaikannya akan menampilkan kesalahan di bawah dalam kasus saya ketika saya mencoba mengeksekusi
basic.py
.Berikut ini adalah kode yang ada di
basic.py
yang melempar kesalahan di atas.kode dengan kesalahan
Lalu saya menambahkan
# -*- coding: utf-8 -*-
baris di bagian paling atas dan dieksekusi. Berhasil.kode tanpa kesalahan
Terima kasih.
sumber
#coding: utf-8
daripada# -*- coding: utf-8 -*-
ini lebih mudah diingat. Berfungsi di luar kotak dengan Python PEP 263 - Mendefinisikan Pengodean Kode Sumber Python .Tidak ada masalah dengan terminal saya. Jawaban di atas membantu saya melihat ke arah yang benar tetapi tidak berhasil sampai saya menambahkan
'ignore'
:Seperti yang ditunjukkan dalam komentar di bawah, ini dapat menyebabkan hasil yang tidak diinginkan. OTOH mungkin juga melakukan trik dengan cukup baik untuk membuat semuanya bekerja dan Anda tidak peduli kehilangan beberapa karakter.
sumber
ini berfungsi untuk ubuntu 15.10:
sumber
Sepertinya string Anda dikodekan
utf-8
, jadi apa sebenarnya masalahnya? Atau apa yang kamu coba lakukan disini ..?sumber
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
, saya ingin menyandikannya dengan benar.Dalam kasus saya, ini disebabkan oleh file Unicode saya disimpan dengan "BOM". Untuk mengatasi ini, saya membuka file menggunakan BBEdit dan melakukan "Save as ..." memilih untuk encoding "Unicode (UTF-8)" dan bukan yang disertakan dengan "Unicode (UTF-8, with BOM) "
sumber
Saya mendapatkan jenis kesalahan yang sama, dan saya menemukan bahwa konsol tidak mampu menampilkan string dalam bahasa lain. Oleh karena itu saya membuat perubahan kode di bawah ini untuk mengatur default_charset sebagai UTF-8.
sumber
Ini adalah jawaban terbaik: https://stackoverflow.com/a/4027726/2159089
di linux:
begitu
sys.stdout.encoding
juga OK.sumber
BOM, sering kali BOM bagi saya
vi file tersebut, gunakan
dan simpan. Itu hampir selalu memperbaikinya dalam kasus saya
sumber
Saya mengalami kesalahan yang sama, dengan URL yang berisi karakter non-ascii (byte dengan nilai> 128)
Bekerja untuk saya, dengan Python 2.7, saya kira tugas ini mengubah 'sesuatu' dalam
str
representasi internal - yaitu, memaksa decoding yang tepat dari urutan byte yang didukungurl
dan akhirnya menempatkan string ke dalam utf-8str
dengan semua keajaiban di tempat yang tepat. Unicode dengan Python adalah sihir hitam bagi saya. Semoga bermanfaatsumber
saya memecahkan masalah itu dengan mengubah file settings.py dengan 'ENGINE': 'django.db.backends.mysql', jangan gunakan 'ENGINE': 'mysql.connector.django',
sumber
Cukup ubah teks secara eksplisit menjadi string menggunakan
str()
. Bekerja untuk saya.sumber