cx_freeze与utf-8字符不显示的问题

0 投票
1 回答
1034 浏览
提问于 2025-04-16 23:50

我正在尝试编译一个包含西班牙语字符串的Python脚本。

如果我直接运行这个.py文件,显示是正确的。编译过程也没有问题,但当我运行生成的.exe文件时,里面的非ASCII字符(比如ñ)都被替换成了错误的字符,而且没有任何错误提示。

我找不到其他人问过同样的问题,是我一个人在尝试编译ñ这个字符,还是我在编译过程中漏掉了什么?

我使用的是Python 3.1.2和cx_freeze 4.2.1,在Windows XP上。这个问题在使用基本编译(\Scripts\cxfreeze)和高级编译(setup.py)时都一直存在。

测试代码,main.py

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

运行.py文件的结果

正确的输出

运行.exe文件的结果

cx_freeze输出

编辑:

冻结的Machin测试源代码

冻结的Machin测试源代码

1 个回答

1

虽然不能完全确定,但假设你的源文件和显示出来的内容在传输过程中没有被改变,你的问题可能是这样的:

你期待看到的是(带重音的a、带波浪线的n、带重音的o),但实际上你看到的是一些“错误字符”(比如不换行空格、货币符号、分币符号)。

我没有使用cxfreeze。我的猜测是,cxfreeze可能在对你的输出进行双重编码。这是基于我在Windows 7上使用Python 3.2.0运行以下源文件的结果。你会注意到,我使用了转义序列来表示文本字符,以排除源编码问题带来的干扰。

# 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

在“看到的输出”后面的括号里,我看到了预期的带重音的a、带波浪线的n和带重音的o。请分别运行脚本一次使用cxfreeze,一次不使用,并用文字描述你看到的结果。如果冻结后的“看到的输出”确实是一个空格后面跟着一个货币符号和一个分币符号,你应该把这个问题报告给cxfreeze的维护者,并附上这个回答的链接。

撰写回答