Уведомления

Группа в Telegram: @pythonsu

#1 Июль 25, 2012 22:07:46

nmh
Зарегистрирован: 2012-07-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

Всем привет, прошу помощи:
Пытаюсь заставить скрипт работать со сторонней DLL.
Нужно задать коллбэк-функцию с таким описанием typedef bool (*tcallback)(BYTE* pData);

Делаю так:

 def testcallback(s):
        print s
....
callback= CFUNCTYPE(c_bool, c_char_p)(testcallback)

Получаю в результате такую строку с крякозябрами: <server_status connected=“error”>Сервер РЅРµ доступен</server_status>

Должно быть: <server_status connected=“error”>Сервер не доступен</server_status>, т.е. я имею дело с юникодом, которые неправильно интерпретируется, как cp1251

Ок, делаю так:
 def testcallback(s):
        print s
....
callback= CFUNCTYPE(c_bool, c_wchar_p)(testcallback)

Получаю ошибку UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-40: ordinal not in range(128)

Что я делаю не так?

Отредактировано nmh (Июль 25, 2012 22:08:38)

Офлайн

#2 Июль 26, 2012 01:11:31

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

А не проще ли строку декодировать (хоть и не на 100% правильно)?

Офлайн

#3 Июль 26, 2012 14:49:37

nmh
Зарегистрирован: 2012-07-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

odnochlen
А не проще ли строку декодировать (хоть и не на 100% правильно)?
не проще, не хочет декодировать, совсем

Офлайн

#4 Июль 26, 2012 16:26:59

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

s.decode('utf8') не работает?

Офлайн

#5 Июль 26, 2012 16:29:28

nmh
Зарегистрирован: 2012-07-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

odnochlen
s.decode('utf8') не работает?
не работает.

Офлайн

#6 Июль 26, 2012 16:31:04

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

Как ты так быстро ответил?

Какая версия питона? Выложи:

print type(s)
print repr(s)
print s.encode('hex')

Отредактировано odnochlen (Июль 26, 2012 16:42:23)

Офлайн

#7 Июль 26, 2012 21:27:09

nmh
Зарегистрирован: 2012-07-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

odnochlen
Как ты так быстро ответил?
До этого пробовал, естественно.

odnochlen
Какая версия питона? Выложи:
print type(s)
print repr(s)
print s.encode('hex')

1)<type ‘unicode’>
2)u'\u733c\u7265\u6576\u5f72\u7473\u7461\u7375\u6320\u6e6f\u656e\u7463\u6465\u223d\u7265\u6f72\u2272\ud03e\ud0a1\ud1b5\ud080\ud0b2\ud1b5\u2080\ubdd0\ub5d0\ud020\ud0b4\ud1be\ud181\ud182\ud083\ud0bf\ud0b5\u3cbd\u732f\u7265\u6576\u5f72\u7473\u7461\u7375>\u4c43\u4549\u6726\u6b98\uad7f\x02\u28c0\u01b6\u2f28\u01b6\x16'
3) UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-40: ordinal not in range(128)

Офлайн

#8 Июль 26, 2012 21:40:07

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

А куда происходит вывод строки? и какая ось?

Есть ли строка в начале скрипта? # -*- coding: utf-8 -*-

Отредактировано Piton23 (Июль 26, 2012 21:40:28)

Офлайн

#9 Июль 26, 2012 21:52:47

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

print s.encode("utf16").decode("utf8","ignore")
Там еще мусор в строке.

Отредактировано odnochlen (Июль 26, 2012 21:53:16)

Офлайн

#10 Июль 27, 2012 07:55:27

nmh
Зарегистрирован: 2012-07-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

ctypes проблема с кодировкой

Piton23
А куда происходит вывод строки? и какая ось?

Есть ли строка в начале скрипта? # -*- coding: utf-8 -*-
Windows 7, сейчас вывод в python shell
Строка такая есть.

odnochlen
print s.encode(“utf16”).decode(“utf8”,“ignore”)
Получаем тогда такое:
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 33-38: ordinal not in range(128)
Короче, ни кодировать, ни декодировать эту строку питон не хочет

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version