ValdikSS/blockcheck

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 и не знал об этом. В конце концов, большинство программ работают в ней без ошибок.