如何在Python中将Unicode转换为UTF-8?

2 投票
2 回答
4366 浏览
提问于 2025-04-18 10:06

我正在编写一个Python脚本,用来从sqlite3数据库中提取数据,以便用于xbmc媒体应用。

在我的代码中,我发现提取的数据是用unicode对象表示的,其中包含了字符串 (u'uL

我想把这些unicode对象转换回普通字符串,也就是utf8格式。

以下是我的代码:

programs = None
daysLimit = 14
start = datetime.datetime.now()
end = start + datetime.timedelta(days = daysLimit)
cur.execute('SELECT channel, title, start_date, stop_date FROM programs WHERE channel')
programs = cur.fetchall()

print(programs)
cur.close()

这是xbmc的日志:

03:49:03 T:3628  NOTICE: [(u'101 ABC FAMILY ', u'The Middle -  The Ditch',
20140520170000L, 20140520173000L), (u'101 ABC FAMILY ', u'The Goonies', 
20140520173000L, 20140520200000L), (u'101 ABC FAMILY ', u'Pirates of the Caribbean: On Stranger Tides', 
20140520200000L, 20140520230000L), (u'101 ABC FAMILY ', u'The 700 Club', 
20140520230000L, 20140521000000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  Day Damn One', 
20140521000000L, 20140521003000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  Lucky Charm', 
20140521003000L, 20140521010000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  The Ethnic Tip', 
20140521010000L, 20140521013000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  The Young and the Restless', 
20140521013000L, 20140521020000L), (u'101 ABC FAMILY ', u'Summer Sexy With T25!', 
20140521020000L, 20140521023000L), (u'101 ABC FAMILY ', u'Paid Programming', 
20140521023000L, 20140521030000L)

我想忽略字符串 (u'uL,所以我希望它看起来像这样:

'101 ABC FAMILY ', 'The Middle -  The Ditch', 20140520170000, 20140520173000, 
'101 ABC FAMILY ', 'The Goonies', 20140520173000, 20140520200000, 
'101 ABC FAMILY ', 'Pirates of the Caribbean: On Stranger Tides', 20140520200000, 20140520230000, 
'101 ABC FAMILY ', 'The 700 Club', 20140520230000, 20140521000000, 
'101 ABC FAMILY ', 'The Fresh Prince of Bel-Air -  Day Damn One', 20140521000000, 20140521003000,
and so on...

你能告诉我如何在Python 2.6版本中将unicode对象转换为utf8吗?

2 个回答

2
  • L这个后缀表示长整型数字。其实它和普通整型数字是一样的;你根本不需要去转换它们。只有在用repr()函数输出的时候,才会看到这个L;如果你直接打印这个值或者把它写入文件,L这个后缀就不会出现了。

  • Unicode值可以通过unicode.encode()方法转换成UTF-8格式:

    encoded = unicodestr.encode('utf8')
    

你所关心的是这里的列表表示方式;你记录了所有的行,而Python的容器通过对每个值调用repr()来表示它们的内容。这种表示方式在调试时非常有用,因为它能清楚地显示出每个值的类型。

接下来你对这些值的处理方式很重要。一般来说,建议在代码中始终使用Unicode,只有在最后一步(比如写入文件、打印或者通过网络发送时)才进行编码。很多方法会为你处理这些事情。例如,打印时会自动转换成你的终端编码。当你添加内容到XML文件时,大多数XML库也会为你处理Unicode。等等。

0

你的问题是,你试图显示数据,但实际上你显示的是这个对象的python表示形式

这其中包含了一些元数据,比如u、L等。如果你想按照自己的方式显示数据,你需要写一些代码来处理它。

比如说:

for row in cur.fetchall():
    print u"'{row[0]}', '{row[1]}', '{row[2]}', '{row[3]}', '{row[4]}'".format(row=row)

这样显示出来的效果会是

'1', '2', '3', '4'
'1', '2', '3', '4'
'1', '2', '3', '4'

不过...我注意到你让结构看起来像CSV文件(逗号分隔值),对吧?所以,也许你应该了解一下csv这个python模块?

撰写回答