Итак, я пишу этот код, который отправляет данные на сервер, для отображения пользователю. У меня проблемы с символами юникода. Когда я запускаю сценарий из своей IDE, сервер получает «правильную», unicode-строку, и отображается правильно, но после замораживания скрипта с использованием py2exe или cx_Freeze и запуска файла .exe дисплей состоит из? ? ??? ??? вместо символов.Юникод работает в .py скрипте, но не в замороженном .exe [Python 2.7]
Я предполагаю, что это связано с кодировкой, используемой для замораживания скрипта? У меня очень мало опыта в кодировании, поэтому, пожалуйста, простите мне мое невежество. Вот код, о котором идет речь:
#!/usr/bin/env python
# -*- coding: utf-8 -*- #someone suggested this would solve the problem
import os, time, json, urllib2, getpass, socket, subprocess, ast, ctypes, sys
reload(sys)
sys.setdefaultencoding('UTF8') # another suggestion was to force UTF-8 to be def encoding
subprocess.Popen('chcp 65001', shell=True) # thought I'd give it a go forcing cmd to use utf-8
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
def get_active_window(): #function that gives me the title of the active window (unicode)
hwnd = ctypes.windll.user32.GetForegroundWindow()
length = GetWindowTextLength(hwnd)
buff = ctypes.create_unicode_buffer(length + 1)
GetWindowText(hwnd, buff, length + 1)
return buff.value
def send_server(data, url): #sending data to the server
req = urllib2.Request(url)
req.add_header('Content-Type', 'application/json')
return urllib2.urlopen(req, data).read()
send_server(get_active_window(), "http://foo.com");
Просто напоминание, что это работает, когда выбежала из IDE, так что я предполагаю, что проблема возникает, когда я замораживании сценарий?
Спасибо за любую помощь заранее !!!!
EDIT: Я никогда исправили кодировку в соответствии кодирования: имя, до сих пор не повезло
Быстрое примечание, тип (get_active_window()) возвращает –
Ваша IDE не использует окно командной строки Windows для вывода, поэтому оно работает. Чтобы использовать Codepage 65001, вы должны использовать специальные шрифты для командного окна. Всегда проверяйте свои скрипты из командной строки. – MKesper