2017-02-03 21 views
1

Итак, я пишу этот код, который отправляет данные на сервер, для отображения пользователю. У меня проблемы с символами юникода. Когда я запускаю сценарий из своей 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: Я никогда исправили кодировку в соответствии кодирования: имя, до сих пор не повезло

+0

Быстрое примечание, тип (get_active_window()) возвращает

+1

Ваша IDE не использует окно командной строки Windows для вывода, поэтому оно работает. Чтобы использовать Codepage 65001, вы должны использовать специальные шрифты для командного окна. Всегда проверяйте свои скрипты из командной строки. – MKesper

ответ

1

У меня был довольно похожий сценарий здесь, что делает то же самое, и я использовал CxFreeze распространять мое приложение, но это немного отличается от вашего. Кроме того, я использовал Python2.7 и протестировал на Windows XP, 7, 8 и 10.

Но прежде чем пытаться решить мое решение, я понял, что ваша строка кодирования неверна, потому что она должна быть такой: according to docs :

кодирование: имя или кодирование = имя в комментарии.

Таким образом, вы должны положить: или =

Если вы хотите, вы можете попробовать этот способ, который работает для меня:

from win32gui import GetWindowText, GetForegroundWindow 
active_window = GetWindowText(GetForegroundWindow()) 

я использовал this great website загрузить win32gui

+0

Я понял, что строка кодирования неверна, я ее исправил. Все еще ничего:/ Я использую win32gui, но это не решает мою проблему, поэтому я переключился на ctypes. Когда заголовок окна находится в юникоде, win32gui дает mi str по умолчанию и расшифровывает после него «????» ничего не делает:/ –

+0

как вы пытались декодировать? от utf-8? –

+0

Вам нужно знать, какой декодер он использует ... обычными являются utf-8, ascii и latin-1 ... ascii является значением по умолчанию при использовании «.decode(), но попробуйте с другими 2 и посмотреть, работает ли он @BulseEye –