Проблема с не показанными символами cx_freeze и utf-8 - PullRequest
1 голос
/ 18 августа 2011

Я пытаюсь скомпилировать скрипт на python, который содержит испанские строки.

Если я запускаю .py, он отображается правильно. Компиляция работает нормально, но когда я запускаю полученный .exe-файл, символы, отличные от ascii, заменяются символами ошибок, и об ошибках не сообщается.

Я не смог найти никого, спрашивающего об этой же проблеме, я единственный, кто пытается скомпилировать - или я что-то упустил в моей компиляции?

Я использую python 3.1.2 с cx_freeze 4.2.1 на win xp. Проблема постоянна при базовой компиляции (\ Scripts \ cxfreeze) и расширенной (setup.py)

тестовый код, main.py

# coding=UTF-8
print('mensaje de prueba \u00e1ñ ó \xf1')

работает .py

correct output

работает .exe

cx_freeze output

EDIT:

замороженный тестовый источник Machin

frozen Machin test source

1 Ответ

1 голос
/ 21 августа 2011

Невозможно быть уверенным, но если предположить, что то, что, по-видимому, находится в вашем исходном файле и что, по-видимому, отображается, не было трансмогрифицировано при передаче, ваша проблема заключается в следующем:

Вы ожидаете увидеть (a-острый, n-тильда, o-острый), но на самом деле вы видите "символы ошибки" (пробел без пробелов, также известный как NBSP, знак валюты, знак цента).

У меня нет cxfreeze. Я предполагаю, что cxfreeze вдвойне кодирует ваш вывод. Это основано на запуске следующего исходного файла с использованием Python 3.2.0 в Windows 7. Вы заметите, что я использовал escape-последовательности для текстовых символов, чтобы исключить любой шум, вызванный проблемами кодирования источника.

# coding: ascii ... what you see is what you've got.
# expected output: a-acute(e1) n-tilde(f1) o-acute(f3)
import sys
import unicodedata as ucd
text = '\xe1\xf1\xf3'
print("expected output:")
for c in text:
    print(ascii(c), ucd.name(c))
print("seen output[%s]" % text)
sse = sys.stdout.encoding
print(sse)
print("Expected raw bytes output:", text.encode(sse))
whoops = text.encode(sse).decode('latin1')
print("whoops:")
for w in whoops:
    print(ascii(w), ucd.name(w))

и вот его вывод.

expected output:
'\xe1' LATIN SMALL LETTER A WITH ACUTE
'\xf1' LATIN SMALL LETTER N WITH TILDE
'\xf3' LATIN SMALL LETTER O WITH ACUTE
seen output[áñó]
cp850
Expected raw bytes output: b'\xa0\xa4\xa2'
whoops:
'\xa0' NO-BREAK SPACE
'\xa4' CURRENCY SIGN
'\xa2' CENT SIGN

В скобках после «видимого результата» я вижу а-острый, н-тильда и о-острый, как и ожидалось. Пожалуйста, запустите скрипт с и без cxfreezing и сообщите (на словах), что вы видите. Если замороженный «видимый вывод» фактически является пробелом, за которым следуют знак валюты и знак цента, вы должны сообщить о проблеме (со ссылкой на этот ответ) сопровождающему cxfreeze.

...