strptime的奇怪编码问题

时间:2015-02-14 21:23:59

标签: python encoding strptime

我需要转换

  

14Şubat2015Cumartesi,09:47:49

到日期时间。当我打印这个日期它工作正常但我无法改变time.strptime内部的编码,无论我尝试编码或解码到不同的类型。这是我的代码

# -*- coding: cp1254 -*-
import chardet
import time
from time import mktime
import datetime

h="14 Şubat 2015 Cumartesi, 09:47:49"

kc= datetime.datetime.fromtimestamp(mktime(time.strptime(h.decode('utf-8), "%d %B %Y %A,%H:%M:%S") ))
print kc

print chardet.detect(h)结果是

{'confidence': 0.748485181144929, 'encoding': 'ISO-8859-2'}

3 个答案:

答案 0 :(得分:1)

h应该是一个unicode字符串:

h=u"14 Şubat 2015 Cumartesi, 09:47:49"

我认为您需要将行更改为:

kc= datetime.datetime.fromtimestamp(mktime(time.strptime(h.encode('utf-8'), "%d %B %Y %A,%H:%M:%S") ))

(不能验证,因为我不知道该地区,我因此而得到错误)

确保您的区域设置设置为标识ŞubatCumartesi

使用:

import locale
locale.setlocale(locale.LC_ALL, <your locale>)

答案 1 :(得分:1)

假设您尝试使用土耳其语日期的字符串表示创建datetime对象。

您需要做的第一件事就是将文件的源代码编码从cp1254更改为utf-8,这基本上涵盖了更广泛的字符集。

# -*- coding: utf-8 -*-

其次,您应该将语言环境设置为tr_TR,以便Python了解Şubat在创建日期对象时的含义。

import locale

locale.setlocale(locale.LC_ALL, "tr_TR")

然后,您可以执行以下操作将日期字符串转换为实际的datetime.datetime对象。

import datetime

str_date = '14 Şubat 2015 Cumartesi, 09:47:49'
date_obj = datetime.datetime.strptime(str_date, "%d %B %Y %A, %H:%M:%S")

print date_obj
# will print datetime.datetime(2015, 2, 14, 9, 47, 49)

希望这有帮助。

答案 2 :(得分:1)

找到这个解决方案很痛苦。这是一个Windows解决方案。从您的帖子中不清楚您使用的操作系统。学习:

Python 2.7.9解决方案

以下是.lower()解决方法的解决方案。我专门使用utf-8的源编码来明确表示strptime使用的字符串必须采用正确的cp1254编码。

# coding: utf8
import locale
import datetime
locale.setlocale(locale.LC_ALL,'turkish')
print(locale.getlocale())

h = u"14 Şubat 2015 Cumartesi, 09:47:49"
kc = datetime.datetime.strptime(h.lower().encode('cp1254'), '%d %B %Y %A, %H:%M:%S')
print kc

输出:

('Turkish_Turkey', '1254')
2015-02-14 09:47:49

Python 3.4.2解决方案

Python 3默认使用Unicode来使事情更简单,加上Şubat的案例问题得到解决。

# coding: utf8
import locale
import datetime
locale.setlocale(locale.LC_ALL,'turkish')
print(locale.getlocale())

h = '14 Şubat 2015 Cumartesi, 09:47:49'
kc = datetime.datetime.strptime(h, '%d %B %Y %A, %H:%M:%S')
print(kc)

输出:

('Turkish_Turkey', '1254')
2015-02-14 09:47:49