【发布时间】:2017-02-09 15:34:56
【问题描述】:
我有一个名为“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的值 -
所有 ASCII 文件都是 Unicode(特别是 UTF-8)文件。究竟
atextfile.txt你想改变吗?它是否采用不兼容 ASCII 的 Unicode 编码之一,例如 UTF-16? -
什么是
print(sys.stdout)?print(open('atextfile.txt', 'rb').read())是什么?print(locale.getpreferredencoding())是什么?请不要将带有使用 utf-16 字符编码的文本编码的文件称为“unicode 文件”。 Unicode 字符串在 Python 中没有关联的字符编码——您可以使用多种编码将相同的 Unicode 字符串编码为字节。磁盘上的文件是字节流,有时可以解释为给定适当字符编码的文本。 -
设置
LC_CTYPE——或任何LC_环境变量——会影响Windows上的任何东西是没有意义的。 Windows 语言环境是在控制面板中通过 API 调用配置的,而不是环境变量。 CRT 代码或 CPython 代码中没有任何内容可以查看 Windows 上的这些环境变量。当 stdout 是 tty 时,stdout 编码要么来自GetConsoleOutputCP(),要么默认为locale.getpreferredencoding(),最终从系统ANSI 代码页GetACP()获取编码。
标签: python windows python-3.x unicode character-encoding