当前位置: 首页 > 面试题库 >

使用Sublime Text 3在Python 3中打印UTF-8

冀景明
2023-03-14
问题内容

我有以下Python3代码尝试读取和打印utf-8编码的文件:

f = open('mybook.txt', encoding='utf-8')
for line in f:
    print(line)

使用Sublime Text 3构建时,出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 18: ordinal not in range(128)

但是,当我仅使用python3在终端中执行代码时,该文件即可工作。

我的构建配置是

{
"cmd": ["/usr/local/bin/python3", "$file"]
, "selector": "source.python"
, "file_regex": "file \"(...*?)\", line ([0-9]+)"
}

如果我将其更改为:

f = open('mybook.txt', encoding='utf-8')
for line in f:
    print(line.encode('utf-8'))

然后,它会打印utf-8编码的字节字符串(我认为这是发生了什么)。

b'Hello\n'
b'\xc2\xab\xe2\x80\xa2\n'
b'Goodbye'

但是我也不知道如何从此到在屏幕上打印unicode字符…


问题答案:

答案实际上是在您的问题中链接的问题中-PYTHONIOENCODING需要设置为"utf-8"。但是,由于OS
X很愚蠢,并且无法使用Terminal或通过.bashrc类似文件中设置的环境变量,因此这将无法解决其他问题。相反,您需要将该环境变量传递给Sublime。

幸运的是,ST3构建系统(我不了解ST2)可以"env"选择。这是传递给的键和值的字典exec.py,它负责在不设置"target"选项的情况下运行构建系统。正如我们在上面的评论中讨论的那样,我表示您的示例程序在Linux上以ST3(内部版本3122)运行时,在包含非ASCII字符的UTF-8编码文本文件上可以正常工作,但在OS
X上运行的版本与此不同要使其运行,所需要做的就是更改构建系统以包含以下行:

"env": {"PYTHONIOENCODING": "utf8"},

我保存了构建系统,点击⌘``B,程序运行正常。

顺便说一句,如果您想读取exec.py,或Packages/Python/Python.sublime- build或压缩文件中打包的任何其他文件.sublime- package,请PackageResourceViewer通过Package
Control安装。使用命令面板中的“打开资源”选项来选择单个文件,或使用“提取包”(两者都以“ PackageResourceViewer:”开头,或
prv 使用模糊搜索)将整个包提取到您的Packages文件夹中,可通过选择 Sublime Text → Preferences → Browse Packages… (仅 Preferences → Browse Packages…
在其他操作系统上)。它位于您的硬盘驱动器上的以下位置:

  • Linux: ~/.config/sublime-text-3/Packages
  • OS X: ~/Library/Application Support/Sublime Text 3/Packages
  • Windows常规安装: C:\Users\ ** _YourUserName_** \AppData\Roaming\Sublime Text 3\Packages
  • Windows可移植安装: **_InstallationFolder_** \Sublime Text 3\Data\Packages

一旦将文件保存到您的Packages文件夹中(如果您仅通过“打开资源”选项查看它们并关闭而不更改或保存它们,它们将不会保存),它们将覆盖.sublime- package存档中包含的同名文件。因此,例如,如果要编辑软件包中的默认Python.sublime- build文件,则Python所做的更改将另存为Packages/Python/Python.sublime- build,并且当您Python从菜单中选择构建系统时,它将仅使用您的版本。



 类似资料:
  • 我使用select.select()代替输入,因为我想要输入超时。我在print()函数中使用end参数,因为我希望我的终端有这样一行: 类型 相反,我没有看到“类型” 我的代码: 我正在使用此脚本测试select.select()并打印(str,end=“”)。我阅读了这篇文章(如何在打印语句后抑制换行?)和这两个命令的官方Python3文档。

  • 问题内容: 在Python 2中,我使用了: 我试过了: 问题答案: 在Python2中,是一个引入了以下语句的关键字: 在Python3中,是可以调用的函数: 在这两个版本中,都是一个运算符,它在左侧需要一个字符串,在右侧需要一个值或一个值的元组或一个映射对象(如)。 因此,您的行应如下所示: 另外,对于Python3和更高版本,建议使用-style格式而不是-style格式: Python 3

  • 问题内容: 我是python的新手,正在尝试在一行中扫描由空格分隔的多个数字(以“ 1 2 3”为例),并将其添加到int列表中。我通过使用以下方法做到了: 显然它是可行的,因为当我键入“ 1 2 3”并执行输出时: [1,2,3] 但是我想将其打印在没有括号的一行中,并在数字之间留一个空格,如下所示: 1 2 3 我试着做: 但我得到一个错误: 2 3追溯(最近一次通话最后一次): 打印(arr

  • 我必须使用Java通过热敏打印机打印收据。我已经完成了所有工作。我的程序从数据库中获取数据,并使用特殊字符、制表符和\n转换为一个字符串。然后将字符串传递给另一个将其转换为图形的方法。 问题是当我点击打印按钮时,白纸就出来了。我注意到我的字符串的前4-5个字符被打印在纸币最末端右上角的最后一行。我的打印机是爱普生TM-T81。 打印账单的方法是: 问题是什么?我该如何解决?我认为我没有在drawS

  • 问题内容: 我正在使用BeautifulSoup从HTML提取一些文本,但是我只是想不出如何正确地将其打印到屏幕(或与此相关的文件)上。 这是我的包含文本的类的样子: 当尝试打印一个实例时,这是我在控制台上看到的: 无论我尝试什么,都无法获得想要的输出(上面的文本应该是希伯来语)。我的最终目标是序列化到文件(使用json或pickle)并能够将其读回。 我在Ubuntu 10.10上使用Pytho

  • 在我的项目中,客户需要使用POS打印机打印收据,这可以使用JAVA POS来完成。我在网上搜索没有任何有用的材料,但发现 1.javapos 2.jpos 可以有人请指导我应该进行JAVA POS或JPOS。 该应用程序基于Java Swing desktop而不是基于web。 真的坚持这一点,任何帮助都是非常有用的