【问题标题】:Output ascii characters to stdout in Python 3在 Python 3 中将 ascii 字符输出到标准输出
【发布时间】: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 上运行。

  1. 在 powershell 命令行上运行时,我得到一个 unicode 文件(两个字节/字符)
  2. 在没有设置 LC_CTYPE 的 .bat 文件中运行时,我得到一个 ascii 文件(可能是 utf-8,正如 @jwodder 指出的那样)。
  3. 在设置了 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


【解决方案1】:

stdout 编码由执行 python 脚本的环境定义,例如:

$ python -c "import sys; print(sys.stdout.encoding)"
UTF-8
$ LC_CTYPE=ascii python -c "import sys; print(sys.stdout.encoding)"
US-ASCII

在运行脚本之前尝试调整您的环境。您可以通过设置 PYTHONIOENCODING 环境变量来强制 Python 的编码值。

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2011-08-29
    • 2016-04-06
    相关资源
    最近更新 更多