我有一个名为'xxx.py'的文件,内容如下:
print("a simple string")
当我像这样运行它(Python 3):
python xxx.py >atextfile.txt
我得到了一个Unicode文件。
我想要一个ASCII文件。
如果尝试打印非ASCII字符会抛出异常,我不介意。
有什么简单的更改可以让我的代码输出ASCII字符吗?
我的搜索结果都似乎对于这个简单的问题来说太冗长了。
[编辑] 报告一下我从设置LC_CTYPE中学到的:
我正在运行Windows 7。
- 在PowerShell命令行上运行时,我得到了一个Unicode文件(每个字符两个字节)。
- 在没有设置LC_CTYPE的.bat文件中运行时,我得到了一个ASCII文件(可能是UTF-8,如@jwodder所指出的那样)。
- 在设置了LC_CTYPE=ascii的.bat文件中运行时,我得到了一个可能是ASCII的文件(每个字符1个字节)。
printf()
是如何定义的?标准编码可能由执行xxx.py
的 shell 区域设置定义。您可以尝试LC_TYPE=en_us python xxx.py > atextfile.txt
。请检查sys.stdout.encoding
的值。 - AChampionatextfile.txt
文件的哪一部分呢?它是否使用了不兼容ASCII的Unicode编码,例如UTF-16? - jwodderprint(sys.stdout)
是什么?print(open('atextfile.txt', 'rb').read())
是什么?print(locale.getpreferredencoding())
是什么?请不要将使用utf-16字符编码的文本文件称为“Unicode文件”。在Python中,Unicode字符串没有关联的字符编码——您可以使用多个编码将相同的Unicode字符串编码为字节。磁盘上的文件是一系列字节流,有时可以根据适当的字符编码将其解释为文本。 - jfsLC_CTYPE
或任何LC_
环境变量在Windows上会影响任何内容都没有意义。Windows语言环境是通过控制面板和API调用进行配置的,而不是通过环境变量。在Windows上,CRT代码或CPython代码中没有任何东西会查看这些环境变量。stdout编码要么来自GetConsoleOutputCP()
(当stdout是tty时),要么默认为locale.getpreferredencoding()
,最终从GetACP()
(系统ANSI代码页)获取编码。 - Eryk Sun