Witam,

temat pewnie omówiony wielokrotnie, ale dla mnie nadal nie do końca jasny.
Zacznijmy może od samego systemu.

Pracuje na shellu na Ubuntu 16.04 LTS.
/etc/default/locale wygląda następująco:

#  File generated by update-locale
LANG=en_US.UTF-8
#LANG=pl_PL.UTF-8
#LANGUAGE=POSIX

posiadam plik test4.py

# -*- coding: utf-8 -*-

import sys

va =  sys.getfilesystemencoding()
print('File system encoding')
print(va)

vb = sys.getdefaultencoding()
print('Default encoding')
print(vb)

dict = {'foo' : 'bar',
        'cebula' : 'łąśćźżęó'
        }

for key, value in dict.items():
        print(key + ' : ' + value)

przy próbie wywołania:

File system encoding
ascii
Default encoding
utf-8
foo : bar
Traceback (most recent call last):
  File "test/test4.py", line 18, in <module>
    print(key + ' : ' + value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-16: ordinal not in range(128)

gdy przed wywłoaniem eksportuje zmienną: export PYTHONIOENCODING=UTF-8 a następnie odpale program:

File system encoding
ascii
Default encoding
utf-8
cebula : łąśćźżęó
foo : bar

Działa wybornie.
Teraz przechodzę do mojej aplikacji w Django, odpalanej poprzez uwsgi (nie ma znaczenia, czy w virtualenvie, czy nie).
W pliku ini posiadam wpis: env = PYTHONIOENCODING=UTF-8
Kod aplikacji w duuużym skrócie:

# -*- coding: utf-8 -*-

def command(request):

    if request.method == 'POST':
        for key, value in sorted(request.POST.items()):
            print(key + ' : ' + value)

Jeżeli value ma polskie znaki, to się wywala:

print(key + ' : ' + value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)

Dopiero dodanie w uwsgi.ini env = LC_ALL=pl_PL.UTF-8 lub env = LANG=pl_PL.utf-8 pozwala na stabilne działanie aplikacji.

Teraz pytania:
a) Dlaczego python3 nie wymaga ustawienia takich locales, nawet tymczasowo, a uwsgi już tak aby poprawnie przetwarzać charakterystyczne dla danego języka znaki?
b) Z jakiej funkcji/metody korzystać, w przypadku kiedy zmienne będą printowane, a mogą zawierać znaki charakterystyczne dla różnych języków (tak jak tutaj, wartość klucza ze słownika) przy locales ustawionych na en_US.UTF-8?