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

时间:2012-11-21 18:54:02

标签: python unicode

我收到了这个错误:

  

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

导致错误的代码:

f.write(textwrap.dedent(unicode(the_string))

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

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

3 个答案:

答案 0 :(得分:4)

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

您需要使用unicode字符串的.encode方法将其转换为表示该字符串的一系列字节,然后才能保存它。这基本上是{2.}}类型在Python 2.x中所代表的 - 只是一系列字节,不是一系列你可能期望的字符。但是,Python很容易让你思考,因为当你str类型为print的变量时,Python会将它显示为终端中的一系列字符 - 使用系统的默认unicode编码。

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

换句话说,您几乎肯定想要做以下事情之一:

A)

str

b)中

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

如果你认为这是一个相当恼人和复杂的东西,让你的头脑去执行将一些非ASCII文本写入文件的相当基本的任务,那么 - 我同意你的看法!当我开始使用Python(这是我的第一个编程语言)时,我在理解unicode,字符串编码以及与之相关的Python类型和方法方面努力了很多。然而,复杂性不是Python的错 - 它取决于计算机对文本进行编码的方式,特别是文本中有多个编码的事实。 不同的字节序列可以表示相同系列的字符,具体取决于正在使用的编码。这使得Python不可能只是隐藏你的字符串编码的细节和“像我一样自动做一些明智的事情”,作为一个新手,天真的希望并期望它会。

如果您要编写任何涉及从Web上获取和使用可能包含非ASCII字符的文本数据的大量代码,我建议您仔细阅读本主题并深入了解它,从一般和Python特定的角度来看。

答案 1 :(得分:2)

您可以尝试使用unicode字符串,如下所示:

jstring = u“桜の花びらたち”

请参阅:http://docs.python.org/tutorial/introduction.html#unicode-strings

答案 2 :(得分:0)

使用其他语言(或编码)并写入文件时,我发现为我工作的是用.encode后缀字符串变量。例如:

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