我有一个内部使用unicode的函数,我想用py.test
测试它。目前,我有以下代码:
def test_num2word():
assert num2word(2320) == u"dva tisíce tři sta dvacet"
然而,断言失败了:
E assert u'dva tis\xed...i sta dvacet ' == u'dva tis\xc3\...9i sta dvacet'
E - dva tis\xedce t\u0159i sta dvacet
E ? ^ ^ -
E + dva tis\xc3\xadce t\xc5\x99i sta dvacet
E ?
据我所知,我的函数正确返回unicode,然后它尝试与utf-8编码的字符串进行比较,这显然会失败。然而,我认为在我的源代码中使用u"..."
也会将字符串转换为Python内部使用的相同编码。
我的问题是,是否有一种比较这些的理智方式,或者我是否需要使用decode('utf-8')
(在右侧)或encode('utf-8')
(在左边。即使我写了一个包装器函数,这对我来说并不理想 - 必须有一种方法来比较这个!不,使用Python 3不是一个选项。
答案 0 :(得分:1)
您的错误并不清楚,但看起来像;
assert u'dva tis\xed...i sta dvacet ' == u'dva tis\xc3\...9i sta dvacet'
这些字符串前面都有u
,因此它们是unicode字符串。但其中一个包含错误的内容:dva tisÃce tÅi sta dvacet
。
如果该字符串是从测试py文件获取的字符串,那么问题是源代码本身没有使用与保存它相同的编码来读取。这可以通过两种方式解决:
在文本编辑器中另存为UTF-8,并在文件顶部加入# -*- coding: utf-8 -*-
行(请参阅this question。
在源代码中使用字符串文字编码,以避免依赖源文件编码:
断言num2word(2320)== u'dva tis \ u00edce t \ u0159i sta dvacet'
(*:它们在内存中存储在内存中的编码是一个很长的故事,但是作为Python程序员,这通常不必担心。)