修复由另一种语言引起的Python Unicode错误

Wes*_*ter 5 python unicode

我收到这个错误:

UnicodeEncodeError:'ascii'编解码器无法编码位置52-57中的字符:序数不在范围内(128)

导致错误的代码:

f.write(textwrap.dedent(unicode(the_string))
Run Code Online (Sandbox Code Playgroud)

我想写的字符串摘自一个网站,其中包含英语和日语(用于测试)外语单词和名称的音译,例如コンピュータ(konpyūta,"computer")和ロンドン(Rondon,"London").(一些已归化的外国借款可能不会以片假名呈现.)

在Python中处理字符串时使用另一种语言(日语).我如何解析这个以防止错误仍然保留字符串?

Mar*_*ery 4

这里的问题是.write文件对象的方法天真地尝试将你传递的 unicode 字符串(如果你在 Python 2.x 中,这将是这种类型unicode)转换为字节字符串(如果你在 Python 中) 2.x 中,这将是str使用 ASCII 编解码器的类型),但您传递的 unicode 字符串无法使用 ASCII 表示,因为它包含不属于 ASCII 字符集的(日语)字符。

您需要使用.encodeunicode 字符串的方法将其转换为表示该字符串的一系列字节,然后才能保存它。这基本上就是strPython 2.x 中类型所表示的内容 - 只是一系列字节,而不是您可能期望的一系列字符。不过,Python 很容易让您产生不同的想法,因为当您使用print类型的变量str时,Python 使用系统默认的 unicode 编码将其显示为终端中的一系列字符。

您应该在此处使用什么编码来对字符串进行编码取决于您的用例。UTF-8 是最常见的,您可能只是想使用它,但如果您想确保正在写入的文件能够在同一系统上的文本编辑器中正确显示,即使您在使用以下命令的设备上运行它对于不太常用的系统编码(例如 UTF-16),您可能想使用系统的默认编码(如果系统的默认编码无法对您的字符串进行编码,那么这当然会失败)。

换句话说,您几乎肯定想要执行以下操作之一:

A)

f.write(textwrap.dedent(the_string).encode('utf-8'))

b)

import sys
f.write(textwrap.dedent(the_string).encode(sys.getdefaultencoding()))
Run Code Online (Sandbox Code Playgroud)

如果您认为这是一个非常烦人且复杂的负载,需要您花点时间来执行将一些非 ASCII 文本写入文件的相当基本的任务,那么 - 我同意您的观点!当我开始使用 Python(这是我的第一种编程语言)时,我在理解 unicode、字符串编码以及与之相关的 Python 类型和方法方面遇到了很多困难。然而,复杂性并不是 Python 的错 - 这取决于计算机编码文本的方式,特别是文本有多种编码这一事实。不同系列的字节可以表示相同系列的字符,具体取决于所使用的编码。这使得 Python 不可能向你隐藏字符串编码的具体细节,并像我这样一个新手天真地希望和期望的那样“自动做一些明智的事情”。

如果您要编写大量涉及从 Web 获取和使用可能包含非 ASCII 字符的文本数据的代码,我建议您彻底阅读该主题并对其有一个扎实的理解,无论是从一般和特定于 Python 的观点。