Issue 13619: Add a new codec: "locale", the current locale encoding (original) (raw)

Created on 2011-12-17 06:13 by vstinner, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Messages (9)

msg149660 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2011-12-17 06:13

To factorize the code and to fix encoding issues in the time module, I added functions to decode/encode from/to the locale encoding: PyUnicode_DecodeLocale(), PyUnicode_DecodeLocaleAndSize() and PyUnicode_EncodeLocale() (issue #13560). During tests, I realized that os.strerror() should also use the current locale encoding.

Do you think that the codec should be exposed in Python?

--

The C functions are used by:

The codec can be useful for developers interacting with C functions depending on the locale. Examples: strerror(), strftime(), ... Use the filesystem encoding would be wrong for such function because the locale encoding can be changed by setlocale() with LC_CTYPE or LC_ALL. Use the filesystem encoding would lead to mojibake.

Even if the most common usecases of C functions depending on the locale are already covered by the Python standard library, developers may want to bind new functions using ctypes (or something else), and I believe that the locale encoding would be useful for these bindings.

--

The problem with a new codec is that it becomes more difficult to choose the right encoding:

I suppose that this issue can be solve by writing documentation explaining the usage of each codec.

--

Attached patch adds the new locale codec.

The major limitation of the current implementation is that the codec only supports the strict and the surrogateescape error handlers. I don't plan to implement other error handlers because I don't think that they would be useful, but it would be possible to implement them.

--

I would be "nice" to fix os.strerror() and time.strftime() in Python 3.2, but I don't want to fix them because it would require to add the locale codec and I don't want to do such change in a stable version. The issue only concerns few people changing their locale encoding at runtime. I hope that everybody uses UTF-8 and never change their locale encoding to something else ;-)

msg149662 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2011-12-17 06:30

On FreeBSD, Solaris and Mac OS X, b'\xff' can be decoded in

the C locale. The C locale is something like ISO-8859-1, not

7-bit ASCII.

On FreeBSD, it is the ISO-8859-1 encoding.

msg149671 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2011-12-17 15:46

Patch version 2: improve the test. Try also the user locale encoding if the C locale uses ISO-8859-1 (should improve the code coverage on FreeBSD, Mac OS X and Solaris).

msg149678 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2011-12-17 17:05

I tested locale_encoding-2.patch on Linux, FreeBSD and Windows: UTF-8 and ISO-8859-1 locales on Linux and FreeBSD, and the cp1252 ANSI code page on Windows.

msg149946 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2011-12-21 00:48

I would be possible to implement incremental decoder with mbsrtowcs() and incremental encoder with wcsrtombs(), by serializing mbstate_t to a long integer (TextIOWrapper.tell() does something like that). The problem is that mbsrtowcs() and wcsrtombs() are "recent" (not always available). It may also be dangerous to allow the user to pass an arbitrary mbstate_t (using .setstate()).

msg150114 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2011-12-22 21:57

It should be locale.getpreferredencoding(False).

msg150122 - (view)

Author: Antoine Pitrou (pitrou) * (Python committer)

Date: 2011-12-23 00:46

I'm not sure I like this idea. I think it would be nice to see it discussed on python-dev.

msg152819 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2012-02-07 23:38

Fixed in patch version 3.

msg153080 - (view)

Author: STINNER Victor (vstinner) * (Python committer)

Date: 2012-02-10 22:34

According to the discussion on the python-dev mailing list, such codec would add too much confusion to users and so it is better to not add it. http://mail.python.org/pipermail/python-dev/2012-February/116272.html

I close the issue as wont fix.

History

Date

User

Action

Args

2022-04-11 14:57:24

admin

set

github: 57828

2012-02-10 22:34:39

vstinner

set

status: open -> closed
resolution: wont fix
messages: +

2012-02-07 23:38:44

vstinner

set

files: - locale_encoding-2.patch

2012-02-07 23:38:43

vstinner

set

files: - locale_encoding.patch

2012-02-07 23:38:35

vstinner

set

files: + locale_encoding-3.patch

messages: +

2011-12-23 00:46:58

pitrou

set

nosy: + pitrou
messages: +

2011-12-22 21:57:23

vstinner

set

messages: +

2011-12-21 00:48:43

vstinner

set

messages: +

2011-12-17 17:05:38

vstinner

set

messages: +

2011-12-17 16:10:19

ezio.melotti

set

nosy: + lemburg, ezio.melotti

type: enhancement
components: + Unicode
stage: patch review

2011-12-17 15:46:33

vstinner

set

files: + locale_encoding-2.patch

messages: +

2011-12-17 06:30:18

vstinner

set

messages: +

2011-12-17 06:15:44

vstinner

set

files: + locale_encoding.patch
keywords: + patch

2011-12-17 06:13:45

vstinner

create