UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-28: ordinal not in range(128)
vikanezrimaya opened this issue · 10 comments
Traceback (most recent call last):
File "./blockcheck.py", line 453, in <module>
main()
File "./blockcheck.py", line 384, in main
print("IP: {}, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440: {}".format(ip_isp[0], ip_isp[1]))
File "./blockcheck.py", line 110, in print
__builtins__.print(*args, **kwargs)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-28: ordinal not in range(128)
Система ArchLinux.
Зайди на https://2ip.ru/ . Что написано в строчке «Ваш провайдер»?
Ваш провайдер:
Дом.ru
Сначала указал: Нидерланды, провайдер неизвестен, потом понял, что зашел через Tor.
From: Acharvakmailto:notifications@github.com
Sent: 2/23/2016 13:03
To: ValdikSS/blockcheckmailto:blockcheck@noreply.github.com
Cc: kisik21mailto:kisik2010@live.ru
Subject: Re: [blockcheck] UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-28: ordinal not in range(128) (#42)
Зайди на https://2ip.ru/ . Что написано в строчке «Ваш провайдер»?
Reply to this email directly or view it on GitHub:
#42 (comment)
А какая локаль в системе?
$ cat /etc/locale.gen | grep -v '#'
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
Предположительно, активна английская.
Предположительно, активна английская.
Лучше выяснить. Я предполагаю, что активна C
без поддержки Юникода.
- Что выдаёт команда
locale
? - Что выдаёт команда
python3 -c 'import locale; print(locale.getlocale(), locale.getpreferredencoding())'
?
UPDATE: да, и ещё желательно localectl status
0 ✓ kisik21@KisPC ~/blockcheck $ locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
0 ✓ kisik21@KisPC ~/blockcheck $ python -c 'import locale; print(locale.getlocale(), locale.getpreferredencoding())'
(None, None) ANSI_X3.4-1968
0 ✓ kisik21@KisPC ~/blockcheck $ localectl status
System Locale: n/a
VC Keymap: n/a
X11 Layout: n/a
Для справки: в ArchLinux команда python - python третьей версии.
UPDATE: 0 ✓ kisik21@KisPC ~/blockcheck $ LC_ALL="en_US.UTF-8" ./blockcheck.py
- заработало!
Локаль выставьте с UTF-8, любой язык.
LC_ALL="en_US.UTF-8" ./blockcheck.py - заработало!
Можно выполнить localectl set-locale LANG=en_US.UTF-8
чтобы навсегда её установить.
Но что касается blockcheck.py в принципе можно было бы, раз уж print() всё равно переопределяется, ловить там UnicodeEncodeError и просить пользователя выбрать локаль с UTF-8. Или проверять локаль при запуске.
Не-UTF-8 локаль настолько редкое явление, что обрабатывать ее не имеет особого смысла.
Ну ладно.
Хотя вот человек забыл настроить локаль, использовал C
и не знал об этом. В конце концов, большинство программ работают в ней без ошибок.