Repository navigation
time.strftime() and Unicode characters on Windows #52551
Description
Activity
There is inconsistent behavior in time.strftime, comparing Python 2.6 and 3.1. In 3.1, non-ASCII Unicode characters seem to get dropped whereas in 2.6 you can keep them using the necessary Unicode-to-UTF8 workaround.
This should be fixed if it isn't intended behavior.
Python 2.6
>>> time.strftime(u"%d\u200F%A".encode("utf-8"), time.gmtime()).decode("utf-8") u'03\u200fSaturday' >>> time.strftime(u"%d\u0041%A".encode("utf-8"), time.gmtime()).decode("utf-8") u'03ASaturday'
Python 3.1
>>> time.strftime("%d\u200F%A", time.gmtime()) '' >>> len(time.strftime("%d\u200F%A", time.gmtime())) 0 >>> time.strftime("%d\u0041%A", time.gmtime()) '03ASaturday'
- addedstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Apr 3, 2010 This seems to be fixed now, on both 3.1 and 3.2.
Can you try with 3.1.2 and see if it works?
What operating system are you using?Actually the bug seems related to Windows.
Just installed Python 3.1.2, same problem. I'm using Windows XP SP2 with two Python installations (2.6.4 and now 3.1.2).
Definitely a Windows problem. I did this on Visual Studio 2008:
wchar_t out[1000]; time_t currentTime; time(¤tTime); tm *timeStruct = gmtime(¤tTime);size_t ret = wcsftime(out, 1000, L"%d%A", timeStruct); wprintf(L"ret = %d, out = (%s)\n", ret, out);
ret = wcsftime(out, 1000, L"%d\u200f%A", timeStruct); wprintf(L"ret = %d, out = (%s)\n", ret, out);
and the output was
ret = 8, out = (04Sunday) ret = 0, out = ()
Python really shouldn't use any so-called standard functions on Windows. They never work as expected ^^...
Actually the bug seems related to Windows.
See also the issue bpo-10653: wcsftime() doesn't format correctly time zones, so Python 3 uses strftime() instead.
Using 3.4.1 and 3.5.0 I get:-
time.strftime("%d\u200F%A", time.gmtime()) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'locale' codec can't encode character '\u200f' in position 2: Illegal byte sequence
I verified Marks 3.4.1 result with Idle.
It strikes me as a bug that a function that maps a unicode format string to a unicode string with interpolations added should ever encode the format to bytes, lets alone using using an encoding that fails or loses information. It is especially weird given that % formatting does not even work (at present) for bytes.
It seems to me that strftime should never encode the non-special parts of the format text. Instead, it could split the format (re.split) into a list of alternatine '%x' pairs and running text segments, replace the '%x' entries with the proper entries, and return the list joined back into a string. Some replacements would be locale dependent, other not.
(Just wondering, are the locate names of days and months bytes restricted to ascii or unrestricted unicode using native characters?)
- changed the title
[-]strftime and Unicode characters[/-][+]time.strftime() and Unicode characters on Windows[/+]on Oct 1, 2014 @alexander what is you take on this please? I can confirm that it is still a problem on Windows in 3.5.0.
Mark, I am no expert on Windows. I believe Victor is most knowledgable in this area.
22 remaining items
Python's
time.strftime()now passes only ASCII strings to C'sstrftime(), so there are no encoding errors. But the result ofstrftime()still can contain non-ASCII data and it need to be decoded. I think that switching towcsftime()would make decoding less prone to locale misconfiguration errors.Reacted by Steve Dower
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs