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") ))
(无法验证,因为我不知道语言环境,因此我收到错误消息)
确保您的语言环境设置为识别 Şubat
和 Cumartesi
有:
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 不同的语言环境拼写。它必须是
trk
或 turkish
。 https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.90).aspx
- 传递给 datetime 的字符串必须以首选的语言环境编码进行编码。在这种情况下
cp1254
。 getlocale()
表示正确的编码。 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
我需要转换
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") ))
(无法验证,因为我不知道语言环境,因此我收到错误消息)
确保您的语言环境设置为识别 Şubat
和 Cumartesi
有:
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 不同的语言环境拼写。它必须是
trk
或turkish
。 https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.90).aspx - 传递给 datetime 的字符串必须以首选的语言环境编码进行编码。在这种情况下
cp1254
。getlocale()
表示正确的编码。 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