2012-11-21 36 views
5

我得到这个错误:修复Python中的Unicode错误

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

我想写的字符串是一个摘自:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 52-57: ordinal not in range(128)

导致错误的代码一个包含英语和日语(用于测试)的网站音译和外国人名字,例如电脑(konpyūta,“电脑”)和伦敦(Rondon,“伦敦”)的音译。 (一些已归化的外国借贷可能无法以片假名呈现。)

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

+2

的[Python的Unicode指南(http://docs.python.org/2/howto/unicode.html)可能会有所帮助。除此之外,请提供比此更详细的代码,输入,完整回溯。 –

+0

导致错误的行:'f.write(textwrap.dedent(the_string))'。 (编辑主要问题) –

回答

4

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

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

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

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

一)

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

B)

import sys 
f.write(textwrap.dedent(the_string).encode(sys.getdefaultencoding())) 

,如果你认为这是一个相当烦人和复杂的东西负载,让你的头来执行相当基本的任务,写一些非ASCII文本到一个文件,然后 - 我同意你!当我开始使用Python - 这是我的第一个编程语言 - 我挣扎很多与理解的unicode,字符串编码,并且涉及到它的Python类型和方法。然而,复杂性不Python的错 - 这是下降到计算机编码的文本,并明确一个事实,即有文字多重编码的方式。 不同系列字节的可以代表相同一系列字符,这取决于正在使用的编码。这使得它不可能为Python只是对你隐瞒,螺母和字符串编码的螺栓和“自动理智做事”像我,作为一名新秀,天真地希望和预期会。

如果你将要编写的涉及获取和利用可能包含非ASCII字符的网站,我会围绕这个话题彻底建议阅读的文本数据和获取它的一个坚实的理解代码的任何显著量,无论是从一般的还是Python的角度来看。

0

当与另一种语言(或编码)的工作和写作一个文件,我发现为我工作的后缀字符串变量.encode。例如:

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