Repository navigation
codecs.lookup() ignores non-ASCII characters, whereas encodings.normalize_encoding() copies them #83518
Description
Activity
bpo-37751 changed codecs.lookup() in a subtle way: non-ASCII characters are now ignored, whereas they were copied unmodified previously.
I would prefer that codecs.lookup() and encodings.normalize_encoding() behave the same. Either always ignore or always copy.
Moreover, it seems like there is no test on how the encoding names are normalized in codecs.register(). I recall that using codecs.register() in an unit test causes troubles since there is no API to unregister a search function. Maybe we should just add a private function for test in _testcapi.
Serhiy Storchaka wrote an example on my PR:
https://github.com/python/cpython/pull/17997/filesThere are other differences. For example, normalize_encoding("КОИ-8") returns "кои_8", but codecs.lookup normalizes it to "8".
The comment in the sources is also not correct.
- added3.9 (EOL)end of lifeend of lifestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directory
on Jan 14, 2020 I would prefer that codecs.lookup() and encodings.normalize_encoding() behave the same. Either always ignore or always copy.
How about calling
encodings.normalize_encoding() in codecs.normalizestring()to keep same behavior?(I create PR18845)Maybe we should just add a private function for test in _testcapi
I can try to add some test cases in next weekend ;)
How about calling
encodings.normalize_encoding() in codecs.normalizestring()to keep same behavior?(I create PR18845)I have try this idea, but it make the testcase of test_io.py failed because some object will call
codecs.Lookup()in__del__().-->extension module will be cleaned before calling__del__().I would prefer that codecs.lookup() and encodings.normalize_encoding() behave the same. Either always ignore or always copy.
I try to add a
_Py_normalize_unicode_encoding()in unicodeobject.c to support non-ASCII encoding names' normalization(PR18987), but this PR caused many testcases failed.For example:
In master:
python3.9 -c "print('a\xac\u1234\u20ac\u8000\U0010ffff'.encode('iso-8859-15', 'namereplace'))"
result:
b'a\xac\\N{ETHIOPIC SYLLABLE SEE}\xa4\\N{CJK UNIFIED IDEOGRAPH-8000}\\U0010ffff'after PR18987:
./python -c "print('a\xac\u1234\u20ac\u8000\U0010ffff'.encode('iso-8859-15', 'namereplace'))"
result:
b'a\xac\\N{ETHIOPIC SYLLABLE SEE}\\N{EURO SIGN}\\N{CJK UNIFIED IDEOGRAPH-8000}\\U0010ffff'Maybe we should just add a private function for test in _testcapi.
Oh, there have a problem with this idea:
struct _is is defined in internal/pycore_pystate.h.
_testcapi must test the public Python C API, not CPython internal C API_testcapi must test the public Python C API, not CPython internal C API
Use _testinternalcapi in this case.
Use _testinternalcapi in this case.
oh, forgive me. I don't atttention this extension module before :(Thanks Hai Shi for the change and for new codecs and encodings tests.
Thanks for everyone's continus review :)
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: