strptime 的奇怪编码问题

strange encoding issue with strptime

我需要转换

14 Şubat 2015 Cumartesi, 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

打印chardet.detect(h)结果为

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

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>)

假设您正在尝试从土耳其日期的字符串表示中创建一个 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)

希望对您有所帮助。

找到这个解决方案很痛苦。这是一个 Windows 解决方案。从您的 post 中并不清楚您使用的 OS 是什么。经验教训:

  • Windows 使用与 *nixs 不同的语言环境拼写。它必须是 trkturkishhttps://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.90).aspx
  • 传递给 datetime 的字符串必须以首选的语言环境编码进行编码。在这种情况下 cp1254getlocale() 表示正确的编码。 https://docs.python.org/2/library/datetime.html(底部注释 1)。
  • Python 没有通过 Turkey Test。 Python 2.7.9(至少)在 strptime 中有一个错误,它不会接受 Şubat,但会接受 şubat。解决方案是在处理之前 .lower() 字符串。 Python 2 和 3 在月份的大写版本上也有问题。

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