18 Responses to Ребята, есть вопрос по кодировке в питоне.

  1. YobRU:

    Cразу скажу, на питоне опыта ноль, но давно хотел его пощупать, поэтому кое-какую литературу читал.

    В общем сам скрипт делает запросы к бд, обрабатывает данные и отправляет их через REST API одного трекера. При попытке отправить запрос скрипт начинает ругаться: UnicodeEncodeEor: ‘ascii’ codec can’t encode characters in position 0-8: ordinal not in range(128)

    Теперь вопрос, какого хрена, если:
    1. В начале скрипта стоит # -* – coding: utf-8 -* –
    2. Соединение с бд тоже установлена в charset=’utf8′
    3. Передаваемые аргументы не менялись (т.е. являются элементами мапы, которая возвращается при запросе к бд)

    Если после каждого аргумента написать.encode(‘utf-8’) – все отлично начинает пахать. Есть идеи?

    p.s. Python 2.7

  2. Xuaapp:

    : из базы приходит не утф8?

  3. Zzzer:

    ну так покажи же как запрос отправляешь

  4. Zzzer:

    : из базы тебе пришел юникод

  5. YobRU:

    Ну вот пример:
    # -* – coding: utf-8 -* –
    import MySQLdb
    import MySQLdb.cursors

    class Client:
    __cursor = None

    def __init__(self, host, dbName, user, password, charset=’utf8′):
    con = MySQLdb.connect(host, dbName, user, password, charset=charset, cursorclass=MySQLdb.cursors.DictCursor)
    self.__cursor = con.cursor()

    pass

    def query(self, sql, params=None):
    if params is not None:
    if type(params) is not tuple and type(params) is not list :
    params = (params,)

    for value in params :
    sql = sql.replace(“?”, “‘” + str(value) + “‘”, 1)

    self.__cursor.execute(sql)

    return self.__cursor.fetchall()

    def getProjectByID(self, id):
    res = self.query(“SELECT * FROM projects WHERE id=?”, id)

    if len(res) :
    return res[0]

  6. Zzzer:

    : ну похоже str все ломает, да и вообще либа, которая не умеет в bind параметров провал какой-то

  7. KoZlo:

    (в питоне) utf8 это кодировка, в которую можно закодировать строку. а unicode это тип, ну то есть есть str, есть unicode и так далее

    чтобы перевести строку из unicode в str, надо использовать.encode(‘utf-8’). если ты этого не делаешь, имплицитно делается.encode(‘ascii’). но асцции не могут, а гвиды не хотят, так что ты получаешь экцепшен

  8. YobRU:

    : Спасибо – теперь все прояснилось. А дефолтные значение encode выставить нельзя? Ну просто крайне неудобно каждый раз писать всю эту мутотень.

  9. Lagapp:

    Проблема в питоне, к которому юникод прикручен резинкой от трусов.

  10. KoZlo:

    : неа. пиши обертку для функций запросов к бд или ищи цивильную библиотеку, которая уже это сделала

  11. N0ibad:

    Алексей, в блоге в рабочее время, как так? 🙂

  12. RrZZ:

    : а он по работе, вестимо 🙂

  13. RrZZ:

    : Ммм, я бы не сказал. «Проблема» скорее в «Explicit is better than implicit», и, соответственно, в необходимости, чтобы программист ясно понимал, что такое «кодировка», «набор символов» и в чём разница между «utf-8» и «unicode». Когда такое понимание есть, UnicodeEncodeEor и UnicodeDecodeEor не вылезают.

  14. YobRU:

    : 🙂 Обижаешь. А я смотрю ты тоже во всю работаешь 😉

  15. N0ibad:

    : блог моей работе никогда не мешала)

Добавить комментарий